Java 为什么这个基于JNI的JBoss模块会抛出错误;Can';“找不到依赖库”吗;?
我在JBoss上部署了一个Java web应用程序Java 为什么这个基于JNI的JBoss模块会抛出错误;Can';“找不到依赖库”吗;?,java,c++,java-native-interface,jboss7.x,jboss-modules,Java,C++,Java Native Interface,Jboss7.x,Jboss Modules,我在JBoss上部署了一个Java web应用程序myproject.war。应用程序的一部分使用JNI连接到C++ DLL,该调用从一组第三方库调用函数。我们正在将此应用程序从x32服务器迁移到x64服务器 优先环境构建 32位Windows Server 2003 JBoss6.X Java1.6.X 新环境建设 64位Windows Server 2008 R2,SP1(6.1.7601) JBoss AS 7.2.0最终版“Janus” Java运行时1.7.0_45-b18 已安
myproject.war
。应用程序的一部分使用JNI连接到C++ DLL,该调用从一组第三方库调用函数。我们正在将此应用程序从x32服务器迁移到x64服务器
优先环境构建
- 32位Windows Server 2003
- JBoss6.X
- Java1.6.X
- 64位Windows Server 2008 R2,SP1(6.1.7601)
- JBoss AS 7.2.0最终版“Janus”
- Java运行时1.7.0_45-b18
- 已安装Visual Studio 2010可再发行x64
C:\Windows\System32\
中,应用程序能够通过JNI成功连接到它们。第三方库包括几个DLL、一些ICC配置文件和一个资源文件夹,其中包含文件的子文件夹,包括True type字体、配置和其他文件
对于迁移,创建了一个JBoss模块来包含JNI代码。Java/JNI代码被移动到MyModule.jar
,而MyDriver.dll
被重新编译到x64。获得了第三方库的x64版本
我有
- 使用Visual Studio 2010(10.0.40219.1 SP1Rel)为64位重新编译
MyDriver.dll
- 将第三方dll和资源文件夹的
和64位版本放入模块文件夹MyDriver.dll
。\main\lib\win-x86\u 64\
- 将模块文件复制到
文件夹下的路径modules
- 已创建
module.xml
- 使用适当的资源
。MyModule.jar
- 它有类
加载MyDriverLoader
MyDriver.dll
- 它有类
- 参考模块
,我不是100%确定JNI需要它sun.jdk
- 使用适当的资源
- MFC的使用:使用标准Windows库
{JBOSS\u HOME}\modules\com\mymodule\main\lib\win-x86\u 64
添加到Windows环境变量PATH
,并用echo%PATH%
确认了这一点,其中包括:D:\Java\jdk1.7.0\u 45\bin;D:\Jboss\Jboss-7.2.0.Final\modules\com\mymodule\main\lib\win-x86\u 64代码>
MSVCP100D.DLL
,MSVCR100D.DLL
和IESHIMS.DLL
。我在c:\Windows\System32
和c:\Windows\SysWOW64
文件夹中都找到了MSCV*.DLL
文件,但每个文件夹中的文件大小不同。Dependency Walker已检测到驻留在system32
中的其他文件的路径,因此我不理解它为什么找不到MSCV*.DLL
文件。为了测试,我将它们放入与MyDriver.dll
相同的文件夹..\lib\win-x86_64
,但这并没有改变什么module.xml
<module xmlns="urn:jboss:module:1.1" name="com.mymodule">
<main-class name="com.mymodule.DriverClassName"/>
<resources>
<resource-root path="MyModule.jar"/>
</resources>
<dependencies>
<module name="sun.jdk"/>
</dependencies>
</module>
public class MyDriverLoader {
/**
* Load C++ Library
*/
static {
System.loadLibrary("MyDriver");
}
/**
* Native Method to return the version of the C++ DLL.
*/
public native static String getVersion();
/**
* Main method calls getVersion.
*
* @param args
*/
public static void main(String args[]) {
System.out.println("MyDriverLoader calling MyDriver.dll version " + getVersion());
}
}
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.mymodule" />
</dependencies>
</deployment>
</jboss-deployment-structure>
jboss部署结构
<module xmlns="urn:jboss:module:1.1" name="com.mymodule">
<main-class name="com.mymodule.DriverClassName"/>
<resources>
<resource-root path="MyModule.jar"/>
</resources>
<dependencies>
<module name="sun.jdk"/>
</dependencies>
</module>
public class MyDriverLoader {
/**
* Load C++ Library
*/
static {
System.loadLibrary("MyDriver");
}
/**
* Native Method to return the version of the C++ DLL.
*/
public native static String getVersion();
/**
* Main method calls getVersion.
*
* @param args
*/
public static void main(String args[]) {
System.out.println("MyDriverLoader calling MyDriver.dll version " + getVersion());
}
}
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.mymodule" />
</dependencies>
</deployment>
</jboss-deployment-structure>
模块的文件夹结构mymodule
:
{JBOSS_HOME}\modules\com\mymodule\main
- MyModule.jar
- module.xml
- \lib\win-x86\u 64\
- MyDriver.dll
- ThirdPartyA.dll
- ThirdPartyB.dll
- ThirdPartyC.dll
- ThirdPartyD.dll
- \资源\数据\设置\
- foo.optionfile
- bar.optionfile
我想出来了,下面是方法
我已经改变了构建未来开发可部署组件的常规。解决此类问题的最终工具是process monitor:。它将为您提供有关如何加载DLL的详细日志。