我目前正在尝试让Tomcat应用程序运行在带有本地库的Maven上,它需要一个指定的java.library.path。通常,要运行带有路径的Tomcat,必须做一些事情,比如将路径添加到Tomcat:How to add a native library in Tomcat?。
但在本例中,我想使用Maven插件运行Tomcat,不幸的是,我找不到任何关于如何为Tomcat-Maven插件设置java.library.path的提示。仅仅用-Djava.library.path=XX设置argLine是行不通的。有没有人知道如何在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插件中加载set 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不接受绝对路径-所以总的来说,这种方式也不起作用,至少我是这样尝试的。
发布于 2014-08-20 04:31:33
我通过使用MAVEN_OPTS让mvn tomcat:run处理opencv_java249.so文件。
简单地执行以下操作:
MAVEN_OPTS=-Djava.library.path=/path/to/your/native/libfolder工作得很好。我在我的机器上使用了一个绝对路径,它正在工作。不过我还没试过相对的。
发布于 2015-09-16 19:50:46
您可以在您的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>发布于 2014-06-13 16:37:36
这个问题的一个可能的解决方案是我用另一种方式(从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以某种方式设置路径),我很高兴听到关于这个问题的其他解决方案。
https://stackoverflow.com/questions/24037409
复制相似问题