1

我有一个在 mavenized java 项目中使用的库。该库由两部分组成:一个公开 API 的 jar 和 3 个 dll(本机库)。jar中有一段代码加载dll,所以dll所在的目录必须在PATH环境变量中。

将 jar 添加到我的项目中很容易。我设置 dll 的方式是每个开发人员将 dll 下载到一个目录中,然后将 path-to-dlls 添加到 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 的方式,则可以修改 PATH(使用JNA)并将 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);
}

注意:我没有测试任何这些。第二种解决方案不适用于 Linux(但可以进行一些更改。)

于 2012-12-10T22:55:52.680 回答