0

myproject.warJBoss にデプロイされた Java Web アプリケーションがあります。アプリケーションの一部は、JNI を使用して C++ 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 最終「ヤヌス」
  • Java ランタイム 1.7.0_45-b18。
  • Visual Studio 2010 再頒布可能 x64 インストール済み

古いシステムでは、カスタム DLL とサードパーティ ライブラリが不用意にダンプされC:\Windows\System32\、アプリケーションは JNI 経由でそれらに正常に接続できました。サードパーティ ライブラリには、いくつかの DLL、いくつかの ICC プロファイル、および True-type フォント、構成、その他のファイルを含むファイルのサブフォルダーを含む Resource フォルダーが含まれています。

移行のために、JNI コードを含む JBoss モジュールが作成されました。Java / JNI コードは に移動されMyModule.jarMyDriver.dllx64 に再コンパイルされました。サードパーティ ライブラリの x64 バージョンが取得されました。

私は持っている

  • MyDriver.dllVisual Studio 2010 (10.0.40219.1 SP1Rel) を使用して 64 ビット用に再コンパイル
  • MyDriver.dllサードパーティの DLL とリソース フォルダーの 64 ビット バージョンをモジュール フォルダーに配置..\main\lib\win-x86_64\
  • モジュールファイルをmodulesフォルダーの下のパスにコピーしました
  • 作成したmodule.xml
    • 適切なリソースでMyModule.jar
      • MyDriverLoaderをロードするクラスを持っていますMyDriver.dll
    • モジュールへの参照を使用してsun.jdk、JNIに必要であると100%確信していません。

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: 依存ライブラリが見つかりません

これが教えてくれるのは

  1. JBoss はモジュールから正しい DLL を検出できるため、モジュールを正しく構成できました。
  2. 一部の依存ライブラリが JBoss のパスにありません。

次の解決策を試しましたが、どれも機能せず、エラーが続きます。

  1. Visual Studio 2010 Redistributable x64 をインストールしましたが、これはおそらく既にパッケージ化されています。
  2. {JBOSS_HOME}\modules\com\mymodule\main\lib\win-x86_64Windows 環境変数に明示的に追加し、これを含む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;.
  3. x64 Dependency Walker を実行しましたがMSVCP100D.DLL、見つかりません。と の両方のフォルダーに両方のファイルが見つかりましたが、それぞれのファイル サイズが異なります。Dependency Walker は、存在する他のファイルのパスを検出したため、ファイルが見つからない理由がわかりません。テストするために、 と同じフォルダーにそれらを投げましたが、何も変わりませんでした。MSVCR100D.DLLIESHIMS.DLLMSCV*.DLLc:\Windows\System32C:\Windows\SysWOW64system32MSCV*.DLL...\lib\win-x86_64MyDriver.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

  • MyModule.jar
    • モジュール.xml
    • \lib\win-x86_64\
    • MyDriver.dll
    • サードパーティA.dll
    • ThirdPartyB.dll
    • ThirdPartyC.dll
    • サードパーティD.dll
    • \リソース\データ\設定\
      • foo.optionfile
      • bar.optionfile
4

1 に答える 1

1

私はそれを理解しました、そしてここにその方法があります。

  1. 最初に JBoss から DLL を取り出し、x64 dev/qa サーバー上の JNI を介してネイティブ メソッドへの呼び出しから直接アクセスしようとしました。これは同じエラーで失敗しました。 これは、JBoss ではないことを意味していました。

  2. DLL からサードパーティ ライブラリへの参照を取り除き、再度アクセスを試みました。これも同じエラーで失敗しました。 これは、サードパーティのライブラリやそれらのパスの問題ではないことを意味していました。

  3. 文字列を吐き出すだけの単純な DLL を作成し、前の 2 回と同じ方法でアクセスしようとしました。それも失敗しました。 これは、それが私のコードではないことを意味しました。

  4. VS 2010 で DLL をデバッグとしてコンパイルしていました。DLL を Release として再コンパイルしました。 これで問題は解決しました。

私は再び見つけることができないのに役立つSOの答えを見つけました。それ以外の場合はリンクします。

私が今理解しているように、デバッグで DLL をコンパイルすると、再配布可能であってはなりません。これは、デバッグでコンパイルして x32 開発サーバーで使用した x32 DLL には当てはまりませんでしたが、コンパイルされた x64 DLL には確かに当てはまりました。Release としてコンパイルし、アプリケーション全体で DLL を使用できました。

将来の開発用のデプロイ可能なものを構築するためのルーチンを変更しました。

于 2014-08-06T22:13:22.363 に答える