我在eclipse中有一个Java webapp。我已启用自动部署,因此每当我进行更改时,eclipse会自动将webapp重新部署到我的本地Tomcat服务器,而我所要做的就是刷新页面。到目前为止,这个工作很好,花花公子。
但是,我最近添加了这种依赖:
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_win32_x86_64</artifactId>
<version>3.1.6</version>
</dependency>
此依赖项包括我的Windows计算机上的一些本机库(.dll
文件)。当我手动部署时(通过右键单击项目,单击&#34;运行为&#34;然后&#34;在服务器上运行&#34;),这样可以正常工作。我可以像我期待的那样使用图书馆。
如果我进行更改(任何更改,甚至添加注释),eclipse会自动进行重新部署。但是当我尝试使用该库时(只需刷新页面并再次运行完全相同的代码),我就会收到此错误:
java.lang.UnsatisfiedLinkError: Could not load J2V8 library. Reasons:
no j2v8_win32_x86_64 in java.library.path
所以看来eclipse在自动部署时无法加载本机库,即使它在我手动部署时工作正常。
java.library.path
的值在两种情况下均相同:
C:\Program Files\Java\jdk1.8.0_65\bin;
C:\WINDOWS\Sun\Java\bin;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\ProgramData\Oracle\Java\javapath;
C:\Program Files\ImageMagick-6.9.0-Q16;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\ImageMagick-6.8.9-Q16;
C:\Program Files\Java\jdk1.8.0_65;
c:\Program Files (x86)\Intel\iCLS Client\;
c:\Program Files\Intel\iCLS Client\;
C:\WINDOWS\system32;
C:\WINDOWS;
C:\WINDOWS\System32\Wbem;
C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;
C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;
C:\Program Files\WIDCOMM\Bluetooth Software\;
C:\Program Files\WIDCOMM\Bluetooth Software\syswow64;
C:\Program Files\TortoiseSVN\bin;
C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Bin;
C:\Program Files (x86)\leJOS NXJ\bin;
C:\Program Files (x86)\Windows Live\Shared;
C:\Program Files\OpenVPN\bin;
C:\Program Files\Java\jdk1.8.0_65\bin;
C:\Program Files\apache-ant-1.9.3\bin;
C:\Program Files\apache-maven-3.2.1\bin;
C:\Users\Kevin\Desktop\gradle-2.2.1\bin;
;
C:\Program Files (x86)\SSH Communications Security\SSH Secure Shell;
.
在这两种情况下,.
的位置都是C:\Users\Kevin\Desktop\eclipse\.
,在这两种情况下它都包含相同的文件:
#log.txt#save#
.eclipseproduct
artifacts.xml
configuration
crawl.log
derby.log
dropins
eclipse.exe
eclipse.ini
eclipsec.exe
epl-v10.html
features
notice.html
p2
plugins
Queue.zip
readme
server
StaticVoidGames.log
StaticVoidGames_SystemErr.txt
StaticVoidGames_SystemOut.txt
抛出异常的代码行是:
V8 runtime = V8.createV8Runtime();
当我手动部署时,该代码工作正常,但在后续自动部署时失败。
我的谷歌搜索让我到this forum post,只说#34;重装时可能会出现问题&#34;但是没有提供任何解决方案。所以,我的问题是:
自动重新部署时为什么不包括本机库?
我可以告诉eclipse在自动重新部署时包含本机库吗?我有没有看到一些设置?
如果自动重新部署根本不支持本机库,是否有一些官方消息来源说?
答案 0 :(得分:1)
DLL与特定的类加载器绑定。当我们重新部署时,这意味着用于我们的应用程序的类加载器被销毁。不幸的是,Java虚拟机不允许第二个类加载器再次重新加载DLL。
我认为可以创建一个Jar文件来加载DLL并将其添加到Tomcat本身的类路径中,而不是将其添加到我们的应用程序中。通常Tomcat有一个&#34;共享&#34;可以添加所有应用程序共享的jar文件的目录。
<强>演示:强>
1.将jar范围更改为提供,以便它只能在编译时使用。
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_win32_x86_64</artifactId>
<version>3.1.6</version>
<scope>provided</scope>
</dependency>
将j2v8_win32_x86_64-3.1.6.jar粘贴到共享文件夹
将 $ {catalina.home} / shared / * .jar 附加到 catalina.properties <中的 shared.loader 属性/ p>
参考:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4225434 http://grokbase.com/t/tomcat/users/06acn8f491/jni-native-libraries-and-tomcat-reloading-web-apps