【问题标题】:Where to place dll in Maven projectMaven项目中的dll放在哪里
【发布时间】:2019-06-26 00:49:19
【问题描述】:

我已经下载了我想在我的 Eclipse Maven Java 项目中使用的 sql jdbc 驱动程序。我应该在哪里放置 sqljdbc_auth.dll 文件,以便我可以在 Eclipse IDE 中运行我的项目。那我应该告诉 maven 什么?

更新

我已将sqljdbc_auth.dll 置于src/main/resources,但这没有帮助:

2019-02-01T15:06:02.138+0200 INFO user.dir=C:\projects\eclipse_workspace\RFIDGates
Feb 01, 2019 3:06:02 PM com.microsoft.sqlserver.jdbc.AuthenticationJNI <clinit>
WARNING: Failed to load the sqljdbc_auth.dll cause : no sqljdbc_auth in java.library.path
2019-02-01T15:06:16.927+0200 ERROR Get conn exception
com.microsoft.sqlserver.jdbc.SQLServerException: This driver is not configured for integrated authentication. ClientConnectionId:68da04a3-d764-4c5d-a7ad-addd324db006
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2670) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.AuthenticationJNI.<init>(AuthenticationJNI.java:79) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3381) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:85) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3373) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7344) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2713) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2261) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1921) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1762) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1077) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:623) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    at java.sql.DriverManager.getConnection(DriverManager.java:664) ~[?:1.8.0_171]
    at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:1.8.0_171]
    at com.kpv.rfid.db.ConnectMSSQLServer.main(ConnectMSSQLServer.java:270) [classes/:?]
Caused by: java.lang.UnsatisfiedLinkError: no sqljdbc_auth in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867) ~[?:1.8.0_171]
    at java.lang.Runtime.loadLibrary0(Runtime.java:870) ~[?:1.8.0_171]
    at java.lang.System.loadLibrary(System.java:1122) ~[?:1.8.0_171]
    at com.microsoft.sqlserver.jdbc.AuthenticationJNI.<clinit>(AuthenticationJNI.java:54) ~[mssql-jdbc-6.4.0.jre8.jar:?]
    ... 13 more

【问题讨论】:

  • 将 dll 放置到 src/main/resources 没有帮助。问题正文中的更多详细信息。
  • 你如何加载 dll System.load("***.dll")System.loadLibrary("***.dll")

标签: java eclipse maven jdbc


【解决方案1】:

如果您已经有了 .dll 文件,只需将其存储在项目的 src/main/resources 目录中,Maven 会将其放在目标 jar 的根目录中。

【讨论】:

  • 这是this question第一个答案的副本
  • 将 dll 放到 src/main/resources 没有帮助。问题正文中的更多详细信息。
  • 不幸的是,Java 只能从文件系统加载 DLL,而不能从 Jar 文件加载。您需要编写自己的代码将 .dll 文件从 .jar 提取到文件系统中的某个位置。事情本身很简单:获取资源流,将其转储到文件中。有点不平凡:您在哪里创建 .dll 文件?您如何确保 .dll 的所有依赖项都可用?当您的应用程序未运行时,您如何处理临时 .dll 文件?如果您的应用程序的多个实例正在运行怎么办?
  • 这里是 github 中的一些代码,旨在帮助整个过程:github.com/scijava/native-lib-loader。看看,它应该说明了挑战。随意编写您自己经过深思熟虑的库来做到这一点:)。
【解决方案2】:

您可以将 dll 文件放在文件系统上的任何位置。你只需要确保 JVM 知道它们的路径。

要让 JVM 知道如何加载您的 dll,您必须使用磁盘上 dll 的路径更新java.library.path 变量。

在 Eclipse 中,您可以通过修改 Eclipse 安装根文件夹中的 eclipse.ini 文件来做到这一点,或者您可以在“参数”选项卡 ->“VM 参数”中为每个运行配置执行此操作。

这是需要添加的行:

-Djava.library.path=<path-to-your-dll>

如果您将应用程序打包为可运行的 jar,这同样适用。在这种情况下,命令将是:

java -Djava.library.path=<path-to-your-dll> -jar myjar.jar

但是,您需要注意,您的 dll 也可能具有依赖项,并且它们由操作系统解析。本质上,在系统 PATH 变量中也包含 dll 的路径是一个好主意。

更新

在eclipse.ini中,需要在-vmargs这一行后面加上这个属性:

-vmargs
-Djava.library.path=<path-to-your-dll>
.....

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多