为Tomcat设置java.library.path

3
我目前正在尝试使用Maven和本地库运行Tomcat应用程序,这需要指定java.library.path。通常情况下,在Tomcat中添加路径,需要执行一些操作,例如:添加路径到Tomcat:如何在Tomcat中添加本地库?
但在这种情况下,我想使用Maven插件运行Tomcat,不幸的是,我找不到任何关于如何为Tomcat-Maven插件设置java.library.path的提示。仅仅将argLine设置为-Djava.library.path=XX是无效的。有人有想法如何使用Tomcat-Maven插件包含本地库吗?
根据https://groups.google.com/forum/#!msg/maven-nar/1mz9oWj-65U/dbQEK_6DLdYJ 上的说法,一种应该可以工作的方式是使用 System.setProperty("java.library.path", javaLibPath); 设置路径,然后让类加载器重新加载它。
Field field = ClassLoader.class.getDeclaredField("sys_paths");
field.setAccessible(true);
field.set(null, null);

很不幸,对我而言这并不起作用,错误仍然会被抛出。(这个提示也由http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/给出)。

另一种方法(不是解决实际问题的方法,而是解决我不知道如何在Tomcat-Maven插件中加载设置java.library.path的方法)似乎是在程序运行期间添加库,例如在此处描述的方式:Directory separator should not appear in library name: Macintosh HD/Users/sakkisetty/Documents/dll/FasExtend.dll。不幸的是,这也不起作用。

           File f2 = new File("/home/my/absolute/path");
    for (File f : f2.listFiles()){
        System.out.println("Datei: " + f.getAbsolutePath());
        if (f.isFile() && f.getName().endsWith(".so")){
            System.out.println("Loading: " + f.getAbsolutePath());
            // System.loadLibrary(f.getName());
            System.load(f.getAbsolutePath());
        }
    }

这种情况有两种可能的结果:如果我像这样尝试,会抛出与未加载库时相同的错误。如果我使用 System.loadLibrary,它找不到库,因为库不在 java.library.path 中,并且 System.loadLibrary 不接受绝对路径 - 所以总的来说,这种方式也不起作用,至少我尝试过了。

3个回答

0

我使用MAVEN_OPTS成功地让mvn tomcat:run与一个opencv_java249.so文件一起工作。

仅仅执行:

MAVEN_OPTS=-Djava.library.path=/path/to/your/native/libfolder

运行良好。我在我的机器上使用绝对路径,它可以工作。不过我还没有尝试过相对路径。


0

您可以在pom.xml中为Tomcat Maven插件设置java.library.path,如下所示:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <systemProperties>
            <java.library.path>${basedir}/libraryfolder</java.library.path>
        </systemProperties>
    </configuration>
</plugin>

-1

解决这个问题的一个可能方案是我以另一种方式(从设置Djava.library.path程序化(或替代方案)?)编程设置java.library.path:

private void addJNIPath(String pathToAdd) {
    try {
        Field usrPathsField = ClassLoader.class
                .getDeclaredField("usr_paths");
        usrPathsField.setAccessible(true);

        String[] paths = (String[]) usrPathsField.get(null);

        for (String path : paths)
            if (path.equals(pathToAdd))
                return;

        String[] newPaths = Arrays.copyOf(paths, paths.length + 1);
        newPaths[newPaths.length - 1] = pathToAdd;
        usrPathsField.set(null, newPaths);
    } catch (NoSuchFieldException | SecurityException
            | IllegalArgumentException | IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

由于这似乎仍然不是一个真正好的解决方案(因为应该可以通过Tomcat以某种方式设置路径),我很乐意听取其他解决问题的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接