我有一个myproject.war
部署到 JBoss 的 Java Web 应用程序。应用程序的一部分使用 JNI 连接到 C++ DLL,该 DLL 调用来自一组第三方库的函数。我们正在将此应用程序从 x32 服务器迁移到 x64 服务器。
先前的环境构建
- 32 位 Windows Server 2003
- JBoss 6.X
- Java 1.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 Redistributable x64
在旧系统上,自定义 DLL 和第三方库被毫不客气地转储到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)重新编译
MyDriver.dll
为 64 位 - 将
MyDriver.dll
64 位版本的第三方 DLL 和资源文件夹放入模块文件夹中..\main\lib\win-x86_64\
modules
将模块文件复制到文件夹下的路径- 创建
module.xml
- 与适当的资源
MyModule.jar
。- 其中有
MyDriverLoader
加载的类MyDriver.dll
。
- 其中有
- 参考
sun.jdk
我不是100%确定JNI需要的模块。
- 与适当的资源
DLL是用
- MFC 的使用:使用标准 Windows 库
无论我做什么,在启动应用程序时,JBoss 都会抛出以下 Java 错误:
java.lang.UnsatisfiedLinkError: D:\Jboss\jboss-7.2.0.Final\modules\com\mymodule\main\lib\win-x86_64\MyDriver.dll: 找不到依赖库
这告诉我的是
- JBoss 可以从模块中检测到正确的 DLL,因此我已经正确配置了模块。
- 一些依赖库不在 JBoss 的路径中。
我已经尝试了以下解决方案,但它们都不起作用并且错误仍然存在:
- 我已经安装了 Visual Studio 2010 Redistributable x64,它可能已经被打包了。
- 我已明确添加
{JBOSS_HOME}\modules\com\mymodule\main\lib\win-x86_64
到 Windows 环境变量PATH
并确认了这一点,echo %PATH%
其中包括:D:\Java\jdk1.7.0_45\bin;D:\Jboss\jboss-7.2.0.Final\modules\com\mymodule\main\lib\win-x86_64;
. - 我运行了 x64 Dependency Walker,它告诉我
MSVCP100D.DLL
,MSVCR100D.DLL
但IESHIMS.DLL
没有找到。我MSCV*.DLL
在c:\Windows\System32
和C:\Windows\SysWOW64
文件夹中都找到了这两个文件,但它们的文件大小不同。Dependency Walker 已检测到要驻留的其他文件的路径system32
,所以我不明白为什么它没有找到这些MSCV*.DLL
文件。为了测试,我将它们放入与 相同的文件夹...\lib\win-x86_64
中MyDriver.dll
,但这没有改变。
我能做些什么来解决这个问题?
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>
MyDriverLoader.java
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
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="com.mymodule" />
</dependencies>
</deployment>
</jboss-deployment-structure>
模块文件夹结构mymodule
:
{JBOSS_HOME}\modules\com\mymodule\main
- 我的模块.jar
- 模块.xml
- \lib\win-x86_64\
- 我的驱动程序.dll
- 第三方A.dll
- 第三方B.dll
- 第三方C.dll
- 第三方D.dll
- \资源\数据\设置\
- foo.option 文件
- bar.option文件