1

私は、mavenizedjavaプロジェクトで使用されるライブラリを持っています。ライブラリは、APIを公開するjarと3つのdll(ネイティブlib)の2つの部分で構成されています。jarにはdllをロードするコードが含まれているため、dllが配置されているディレクトリはPATH環境変数に含まれている必要があります。

私のプロジェクトにjarファイルを追加するのは簡単でした。私がdllを設定する方法は、各開発者がdllをディレクトリにダウンロードしてから、path-to-dllをPATH環境変数に追加することです。

理想的には、新しい開発者がプロ​​ジェクトをダウンロードするときに、セットアップをできるだけ少なくしたいと思います。dllをセットアップするためのより良い方法はありますか(プロジェクトとは別にそれらをダウンロードし、ディレクトリをPATHに追加するオーバーヘッドなしで)?

4

1 に答える 1

0

ライブラリのロードコードを変更できる場合:jar/クラスパスにDLLを含めます。次に、DLLファイルをローカルファイルシステムにコピーします。そこからロードします。以下は、ライブラリがクラスパス上にあることを前提としています。

public void loadLibrary(String library) throws IOException {
    InputStream source = getClass().getResourceAsStream(library);
    File tempFile = File.createTempFile("javatmp", ".dll");
    FileOutputStream dest = new FileOutputStream(tempFile);
    try {
        IOUtils.copy(source, dest)
    }
    finally {
        dest.close();
        source.close();
    }
    System.load(tempFile.getAbsolutePath());
    tempFile.delete();
}

ライブラリがDLLをロードする方法を変更できない場合は、(JNAを使用して)PATHを変更し、DLLをその場所にコピーできます。以下は、ライブラリがクラスパスのルートにあることを前提としています。

public void exposeLibrary(String library, File tempDir) throws IOException {
    InputStream source = getClass().getResourceAsStream(library);
    File tempFile = new File(tempDir, library);
    FileOutputStream dest = new FileOutputStream(tempFile);
    try {
        IOUtil.copy(source, dest)
    }
    finally {
        dest.close();
        source.close();
    }    
    WinLibc.INSTANCE._putenv("PATH=" + 
        System.getenv().get("PATH") + File.pathSeparator + tempDir.getAbsolutePath());

    // After this point System.loadLibrary(library) will load the DLL.
}


public interface WinLibC extends Library {
  static WinLibC INSTANCE = Native.loadLibrary("msvcrt", WinLibC.class);

  public int _putenv(String name);
}

注:私はこれをテストしていません。2番目のソリューションはLinuxでは機能しません(ただし、いくつかの変更を加えることで機能する可能性があります)。

于 2012-12-10T22:55:52.680 に答える