我目前正在尝试使用本机库运行带有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.path
而System.loadLibrary
没有采用绝对路径 - 所以总而言之,这样做也没工作,至少我是怎么做的。
答案 0 :(得分:0)
我使用mvn tomcat:run
让MAVEN_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以某种方式设置路径),我很乐意听到有关该问题的其他解决方案。