Java - jni4net Bridge - 部署带有 dll 依赖项的 Jar
Java - jni4net Bridge - Deploying Jar with dll dependenices
我正在使用 jni4net 和我们的供应商提供的一些 dll 创建一个应用程序(也就是说我无法控制 dll)。
在我的 IDE (Eclipse) 中开发程序时,我只是将 jni4net jar 和关联的 dll 放入工作区的项目文件夹中。
[项目目录在IDE][1]
程序 运行 在 IDE 中很好:
fs() throws IOException {
Bridge.setVerbose(true);
Bridge.init();
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("Kratos_3.j4n.dll"));
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("Kratos_3.dll"));
fsod = new FactSetOnDemand();
}
输出:
> loading core from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
loading jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxx from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
loaded jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxx from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
Initialized jni4net core
core loaded from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
loading Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.j4n.dll
loaded Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.j4n.dll
loading Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.dll
loaded Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.dll
现在,当我从 IDE 导出到 运行 可用的 JAR 时,我 select 选项说 'Copy Required Libraries into a sub-folder next to the generated JAR'。在 jar 现在所在的目录中,我将所有库和 dll 放在命令提示符下 运行。
> C:\instHolder>java -jar instHolder.jar
09-29-17 (03:42:12 PM): 317 clients retreived...
09-29-17 (03:42:12 PM): Confirming JVM version: 64
09-29-17 (03:42:12 PM): Java Version confirmation: 1.8.0_144
09-29-17 (03:42:12 PM): setting verbose
loading core from C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
loading jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxx
from C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
loaded jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxfrom C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
Initialized jni4net core
core loaded from C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
09-29-17 (03:42:13 PM): setting j4n
loading Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.j4n.dll
loaded Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.j4n.dll
09-29-17 (03:42:13 PM): setting 3
loading Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.dll
loaded Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.dll
09-29-17 (03:42:13 PM): Press Enter key to continue onto FSOD...
Exception in thread "main" java.lang.UnsatisfiedLinkError: kratos_3.runtimeplatform.FactSetOnDemand.__ctorFactSetOnDemand0(Lnet/sf/jni4net/inj/IClrProxy;)V
at kratos_3.runtimeplatform.FactSetOnDemand.__ctorFactSetOnDemand0(Native Method)
at kratos_3.runtimeplatform.FactSetOnDemand.<init>(FactSetOnDemand.java:25)
at instHolders.fs.<init>(fs.java:46)
at instHolders.init.main(init.java:44)
创建新的 FactSetOnDemand 对象后程序崩溃(上面代码示例的最后一行)
我也将库和 dll 提供给命令行参数并收到相同的错误
java -jar instHolder.jar -Dfile.encoding=Cp1252 -classpath""C:\instHolders\bin;C:\Users\therka\Desktop\JavaAPIs\SQLServer\jtds-1.3.1.jar;C:\Users\therka\Desktop\JavaAPIs\Apache\Commons\commons-net-3.3.jar;C:\Users\therka\Desktop\JavaAPIs\commons-lang3-3.4-bin\commons-lang3-3.4\commons-lang3-3.4.jar;C:\Users\therka\Desktop\JavaAPIs\Apache\IO\commons-io-2.4.jar;C:\Users\therka\Desktop\JavaAPIs\MySQL\mysql-connector-java-5.1.30.jar;C:\instHolders\jni4net.j-0.8.3.0.jar;C:\instHolders\Kratos_3.j4n.jar;C:\instHolder\Kratos_3.dll;C:\instHolder\Kratos_3.j4n.dll;C:\instHolder\jni4net.n-0.8.3.0.dll"" instHolders.init
最终导致相同的未满足链接错误。
有人可以为我指明正确的方向吗?我很确定这是因为我的导出选项和最终的目录布局。
非常感谢!
编辑:
我的头撞到墙上后仍然无法正常工作,我在 IDE 和命令提示符 .jar 中添加了一个进程监视器 - 由此我能够获得命令行参数两者都使用(见下文)。
COMMAND LINE ARGUMENTS-Parent PID: 10988, Command line: java -jar instHolder.jar -Dfile.encoding=Cp1252 -classpath "C:\instHolders\bin;C:\Users\therka\Desktop\Java APIs\SQL Server\jtds-1.3.1.jar;C:\Users\therka\Desktop\Java APIs\Apache\Commons\commons-net-3.3.jar;C:\Users\therka\Desktop\Java APIs\commons-lang3-3.4-bin\commons-lang3-3.4\commons-lang3-3.4.jar;C:\Users\therka\Desktop\Java APIs\Apache\IO\commons-io-2.4.jar;C:\Users\therka\Desktop\Java APIs\MySQL\mysql-connector-java-5.1.30.jar;C:\instHolders\jni4net.j-0.8.3.0.jar;C:\instHolders\Kratos_3.j4n.jar" instHolders.init, Current directory: C:\instHolder\, Environment:
=C:=C:\instHolder
=ExitCode=00000001
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\therka\AppData\Roaming
asl.log=Destination=file
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=xxxxxxxxxxx
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=P:
HOMEPATH=\
HOMESHARE=\xxxxx-fp\data\Users\xxxxx
LOCALAPPDATA=C:\Users\therka\AppData\Local
LOGONSERVER=\xxxxx
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\oracle\product.2.0\client_1\bin;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\Program Files\Java\jre7\bin\javaw.exe
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3a09
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\xxxxx\AppData\Local\Temp
TMP=C:\Users\xxxxx\AppData\Local\Temp
USERDNSDOMAIN=xxxxxxxxxxx .xxxxxxxxxxx
USERDOMAIN=xxxxxxxxxxx
USERNAME=xxxxx
USERPROFILE=C:\Users\xxxxx
windir=C:\Windows
IDE
"IDE ARGUMENTS - Parent PID: 9696, Command line: ""C:\Program Files\Java\jre1.8.0_141\bin\javaw.exe"" -Dfile.encoding=Cp1252 -classpath ""C:\Users\xxxxx\workspace - Copy\instHolders\bin;C:\Users\xxxxx\Desktop\Java APIs\SQL Server\jtds-1.3.1.jar;C:\Users\xxxxx\Desktop\Java APIs\Apache\Commons\commons-net-3.3.jar;C:\Users\xxxxx\Desktop\Java APIs\commons-lang3-3.4-bin\commons-lang3-3.4\commons-lang3-3.4.jar;C:\Users\xxxxx\Desktop\Java APIs\Apache\IO\commons-io-2.4.jar;C:\Users\xxxxx\Desktop\Java APIs\MySQL\mysql-connector-java-5.1.30.jar;C:\Users\xxxxx\workspace - Copy\instHolders\jni4net.j-0.8.3.0.jar;C:\Users\xxxxx\workspace - Copy\instHolders\Kratos_3.j4n.jar"" instHolders.init ""-Djava.library.path=c:\instHolder"", Current directory: C:\Users\xxxxx\workspace - Copy\instHolders\, Environment:
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\xxxxx\AppData\Roaming
asl.log=Destination=file
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=xxxxxxxxxxx
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=P:
HOMEPATH=\
HOMESHARE=\xxxxx-fp\data\Users\xxxxx
LOCALAPPDATA=C:\Users\xxxxx\AppData\Local
LOGONSERVER=\xxxxx
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=C:/Program Files/Java/jre1.8.0_144/bin/server;C:/Program Files/Java/jre1.8.0_144/bin;C:/Program Files/Java/jre1.8.0_144/lib/amd64;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\oracle\product.2.0\client_1\bin;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\program files\java\jdk1.8.0_141\bin;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\Program Files\Java\jre7\bin\javaw.exe;C:\Windows\system32;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3a09
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\xxxxx\AppData\Local\Temp
TMP=C:\Users\xxxxx\AppData\Local\Temp
USERDNSDOMAIN=xxxxxxxxxxx
USERDOMAIN=xxxxxxxxxxx
USERNAME=xxxxx
USERPROFILE=C:\Users\xxxxx
windir=C:\Windows"
我还从进程监视器中看到,当 .jar 将 dll 解压到 类 中然后使用 FactSetOnDemand.class.
时,潜在的问题正在发生。
处理 IDE 的 Montiro 输出
IDE Process Monitor Output
您可以看到 运行ning 成功并创建必要的 类.
运行nable .jar 的进程监视器输出
Command Line Process Monitor Output
这无法创建 类。
经过一周的无所作为后,我在供应商开发人员的帮助下解决了我的问题(感谢 Adrian!)。
最终我的问题是多种因素的结合:
- 从我的 IDE
创建 运行nable .jar 时使用的导出选项
- 已部署的文件夹布局 运行nable .jar
- 我的代码中使用的路径
首先,我使用 'Copy required libraries into a sub-folder next to generated .jar' 选项错误地导出了我的代码。正确的选择是 'package the libraries into generated .jar' 与 运行nable .jar.
其次,我创建了一个文件夹并将 运行nable .jar 导出到其中。在该文件夹中,我创建了一个名为 lib (dosnt matter) 的子文件夹,其中包含 运行 程序所需的 .dll。
第三,我修改了我的代码如下:
Bridge.setVerbose(true);
Bridge.init(new File("C:\Users\therka\Desktop\jar\lib\jni4net.n.w64.v40-0.8.3.0.dll"));
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("C:\Users\therka\Desktop\jar\lib\Kratos_3.j4n.dll"));
fsod = new FactSetOnDemand();
进入 jni4net Bridge.init & Bridge.LoadAndRegisterAssembly 的路径必须指向包含 .dll 的 /lib/ 文件夹。以前我没有指定目录,结果找不到 .dll(导致 unsatisifedLinkerror)。
现在您只需要打开命令提示符,cd 到包含 .jar 的目录,然后 -java -jar 运行nable.
希望这可以让一些人摆脱我不得不经历的头痛。
我正在使用 jni4net 和我们的供应商提供的一些 dll 创建一个应用程序(也就是说我无法控制 dll)。
在我的 IDE (Eclipse) 中开发程序时,我只是将 jni4net jar 和关联的 dll 放入工作区的项目文件夹中。
[项目目录在IDE][1]
程序 运行 在 IDE 中很好:
fs() throws IOException {
Bridge.setVerbose(true);
Bridge.init();
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("Kratos_3.j4n.dll"));
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("Kratos_3.dll"));
fsod = new FactSetOnDemand();
}
输出:
> loading core from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
loading jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxx from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
loaded jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxx from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
Initialized jni4net core
core loaded from C:\Users\therka\workspace - Copy\instHolders\jni4net.n-0.8.3.0.dll
loading Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.j4n.dll
loaded Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.j4n.dll
loading Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.dll
loaded Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\Users\therka\workspace - Copy\instHolders\Kratos_3.dll
现在,当我从 IDE 导出到 运行 可用的 JAR 时,我 select 选项说 'Copy Required Libraries into a sub-folder next to the generated JAR'。在 jar 现在所在的目录中,我将所有库和 dll 放在命令提示符下 运行。
> C:\instHolder>java -jar instHolder.jar
09-29-17 (03:42:12 PM): 317 clients retreived...
09-29-17 (03:42:12 PM): Confirming JVM version: 64
09-29-17 (03:42:12 PM): Java Version confirmation: 1.8.0_144
09-29-17 (03:42:12 PM): setting verbose
loading core from C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
loading jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxx
from C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
loaded jni4net.n-0.8.3.0, Version=0.8.3.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxfrom C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
Initialized jni4net core
core loaded from C:\instHolder\instHolder_lib\jni4net.n-0.8.3.0.dll
09-29-17 (03:42:13 PM): setting j4n
loading Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.j4n.dll
loaded Kratos_3.j4n, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.j4n.dll
09-29-17 (03:42:13 PM): setting 3
loading Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.dll
loaded Kratos_3, Version=3.5.0.0, Culture=neutral, PublicKeyToken=null from C:\instHolder\Kratos_3.dll
09-29-17 (03:42:13 PM): Press Enter key to continue onto FSOD...
Exception in thread "main" java.lang.UnsatisfiedLinkError: kratos_3.runtimeplatform.FactSetOnDemand.__ctorFactSetOnDemand0(Lnet/sf/jni4net/inj/IClrProxy;)V
at kratos_3.runtimeplatform.FactSetOnDemand.__ctorFactSetOnDemand0(Native Method)
at kratos_3.runtimeplatform.FactSetOnDemand.<init>(FactSetOnDemand.java:25)
at instHolders.fs.<init>(fs.java:46)
at instHolders.init.main(init.java:44)
创建新的 FactSetOnDemand 对象后程序崩溃(上面代码示例的最后一行)
我也将库和 dll 提供给命令行参数并收到相同的错误
java -jar instHolder.jar -Dfile.encoding=Cp1252 -classpath""C:\instHolders\bin;C:\Users\therka\Desktop\JavaAPIs\SQLServer\jtds-1.3.1.jar;C:\Users\therka\Desktop\JavaAPIs\Apache\Commons\commons-net-3.3.jar;C:\Users\therka\Desktop\JavaAPIs\commons-lang3-3.4-bin\commons-lang3-3.4\commons-lang3-3.4.jar;C:\Users\therka\Desktop\JavaAPIs\Apache\IO\commons-io-2.4.jar;C:\Users\therka\Desktop\JavaAPIs\MySQL\mysql-connector-java-5.1.30.jar;C:\instHolders\jni4net.j-0.8.3.0.jar;C:\instHolders\Kratos_3.j4n.jar;C:\instHolder\Kratos_3.dll;C:\instHolder\Kratos_3.j4n.dll;C:\instHolder\jni4net.n-0.8.3.0.dll"" instHolders.init
最终导致相同的未满足链接错误。
有人可以为我指明正确的方向吗?我很确定这是因为我的导出选项和最终的目录布局。
非常感谢!
编辑:
我的头撞到墙上后仍然无法正常工作,我在 IDE 和命令提示符 .jar 中添加了一个进程监视器 - 由此我能够获得命令行参数两者都使用(见下文)。
COMMAND LINE ARGUMENTS-Parent PID: 10988, Command line: java -jar instHolder.jar -Dfile.encoding=Cp1252 -classpath "C:\instHolders\bin;C:\Users\therka\Desktop\Java APIs\SQL Server\jtds-1.3.1.jar;C:\Users\therka\Desktop\Java APIs\Apache\Commons\commons-net-3.3.jar;C:\Users\therka\Desktop\Java APIs\commons-lang3-3.4-bin\commons-lang3-3.4\commons-lang3-3.4.jar;C:\Users\therka\Desktop\Java APIs\Apache\IO\commons-io-2.4.jar;C:\Users\therka\Desktop\Java APIs\MySQL\mysql-connector-java-5.1.30.jar;C:\instHolders\jni4net.j-0.8.3.0.jar;C:\instHolders\Kratos_3.j4n.jar" instHolders.init, Current directory: C:\instHolder\, Environment:
=C:=C:\instHolder
=ExitCode=00000001
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\therka\AppData\Roaming
asl.log=Destination=file
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=xxxxxxxxxxx
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=P:
HOMEPATH=\
HOMESHARE=\xxxxx-fp\data\Users\xxxxx
LOCALAPPDATA=C:\Users\therka\AppData\Local
LOGONSERVER=\xxxxx
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\oracle\product.2.0\client_1\bin;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\Program Files\Java\jre7\bin\javaw.exe
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3a09
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\xxxxx\AppData\Local\Temp
TMP=C:\Users\xxxxx\AppData\Local\Temp
USERDNSDOMAIN=xxxxxxxxxxx .xxxxxxxxxxx
USERDOMAIN=xxxxxxxxxxx
USERNAME=xxxxx
USERPROFILE=C:\Users\xxxxx
windir=C:\Windows
IDE
"IDE ARGUMENTS - Parent PID: 9696, Command line: ""C:\Program Files\Java\jre1.8.0_141\bin\javaw.exe"" -Dfile.encoding=Cp1252 -classpath ""C:\Users\xxxxx\workspace - Copy\instHolders\bin;C:\Users\xxxxx\Desktop\Java APIs\SQL Server\jtds-1.3.1.jar;C:\Users\xxxxx\Desktop\Java APIs\Apache\Commons\commons-net-3.3.jar;C:\Users\xxxxx\Desktop\Java APIs\commons-lang3-3.4-bin\commons-lang3-3.4\commons-lang3-3.4.jar;C:\Users\xxxxx\Desktop\Java APIs\Apache\IO\commons-io-2.4.jar;C:\Users\xxxxx\Desktop\Java APIs\MySQL\mysql-connector-java-5.1.30.jar;C:\Users\xxxxx\workspace - Copy\instHolders\jni4net.j-0.8.3.0.jar;C:\Users\xxxxx\workspace - Copy\instHolders\Kratos_3.j4n.jar"" instHolders.init ""-Djava.library.path=c:\instHolder"", Current directory: C:\Users\xxxxx\workspace - Copy\instHolders\, Environment:
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\xxxxx\AppData\Roaming
asl.log=Destination=file
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=xxxxxxxxxxx
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=P:
HOMEPATH=\
HOMESHARE=\xxxxx-fp\data\Users\xxxxx
LOCALAPPDATA=C:\Users\xxxxx\AppData\Local
LOGONSERVER=\xxxxx
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=C:/Program Files/Java/jre1.8.0_144/bin/server;C:/Program Files/Java/jre1.8.0_144/bin;C:/Program Files/Java/jre1.8.0_144/lib/amd64;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\oracle\product.2.0\client_1\bin;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\program files\java\jdk1.8.0_141\bin;C:\Program Files (x86)\Sybase\Shared\PowerBuilder\;C:\Program Files\Java\jre7\bin\javaw.exe;C:\Windows\system32;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3a09
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\xxxxx\AppData\Local\Temp
TMP=C:\Users\xxxxx\AppData\Local\Temp
USERDNSDOMAIN=xxxxxxxxxxx
USERDOMAIN=xxxxxxxxxxx
USERNAME=xxxxx
USERPROFILE=C:\Users\xxxxx
windir=C:\Windows"
我还从进程监视器中看到,当 .jar 将 dll 解压到 类 中然后使用 FactSetOnDemand.class.
时,潜在的问题正在发生。处理 IDE 的 Montiro 输出 IDE Process Monitor Output 您可以看到 运行ning 成功并创建必要的 类.
运行nable .jar 的进程监视器输出 Command Line Process Monitor Output 这无法创建 类。
经过一周的无所作为后,我在供应商开发人员的帮助下解决了我的问题(感谢 Adrian!)。
最终我的问题是多种因素的结合:
- 从我的 IDE 创建 运行nable .jar 时使用的导出选项
- 已部署的文件夹布局 运行nable .jar
- 我的代码中使用的路径
首先,我使用 'Copy required libraries into a sub-folder next to generated .jar' 选项错误地导出了我的代码。正确的选择是 'package the libraries into generated .jar' 与 运行nable .jar.
其次,我创建了一个文件夹并将 运行nable .jar 导出到其中。在该文件夹中,我创建了一个名为 lib (dosnt matter) 的子文件夹,其中包含 运行 程序所需的 .dll。
第三,我修改了我的代码如下:
Bridge.setVerbose(true);
Bridge.init(new File("C:\Users\therka\Desktop\jar\lib\jni4net.n.w64.v40-0.8.3.0.dll"));
Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("C:\Users\therka\Desktop\jar\lib\Kratos_3.j4n.dll"));
fsod = new FactSetOnDemand();
进入 jni4net Bridge.init & Bridge.LoadAndRegisterAssembly 的路径必须指向包含 .dll 的 /lib/ 文件夹。以前我没有指定目录,结果找不到 .dll(导致 unsatisifedLinkerror)。
现在您只需要打开命令提示符,cd 到包含 .jar 的目录,然后 -java -jar 运行nable.
希望这可以让一些人摆脱我不得不经历的头痛。