为tomcat设置java.library.path

时间:2014-06-04 12:25:53

标签: java maven tomcat

我目前正在尝试使用本机库运行带有Maven的Tomcat应用程序,该库需要指定的java.library.path。 Normaly,为了使用路径运行Tomcat,必须做一些事情,比如添加Tomcat的路径:How to add a native library in 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.pathSystem.loadLibrary没有采用绝对路径 - 所以总而言之,这样做也没工作,至少我是怎么做的。

3 个答案:

答案 0 :(得分:0)

我使用mvn tomcat:runMAVEN_OPTS使用opencv_java249.so文件。

简单地做:

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

工作得很好。我在我的机器上使用绝对路径,它正在工作。虽然我没有尝试过亲戚。

答案 1 :(得分: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>

答案 2 :(得分:-1)

这个问题的一个可能的解决方案是我以另一种方式(来自Setting Djava.library.path programmatically (or alternatives)?)以编程方式设置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以某种方式设置路径),我很乐意听到有关该问题的其他解决方案。