5

我在 Eclipse 中有一个 Java webapp。我启用了自动部署,所以每当我进行更改时,eclipse 会自动将 webapp 重新部署到我的本地 Tomcat 服务器,我所要做的就是刷新页面。到目前为止,这工作得很好而且很漂亮。

但是,我最近添加了这个依赖项:

    <dependency>
        <groupId>com.eclipsesource.j2v8</groupId>
        <artifactId>j2v8_win32_x86_64</artifactId>
        <version>3.1.6</version>
    </dependency>

此依赖项包括一些本机库(.dll我的 Windows 机器上的文件)。当我手动部署时(通过右键单击项目,单击“运行方式”,然后单击“在服务器上运行”),这工作正常。我可以完全按照我的预期使用这个库。

如果我然后进行更改(任何更改,甚至添加评论),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();

该代码在我手动部署时运行良好,但在随后的自动部署时失败。

我的谷歌搜索让我看到了这个论坛帖子,它只说“重新加载时可能会出现问题”,但没有提供任何解决方案。所以,我的问题是:

  • 为什么 Eclipse 在自动重新部署时不包括本机库?

  • 我可以告诉 eclipse 在自动重新部署时包含本机库吗?是否有一些我没有看到的设置?

  • 如果自动重新部署根本不支持本机库,是否有一些官方消息来源这么说?

4

1 回答 1

1

DLL 与特定的类加载器相关联。当我们重新部署时,这意味着用于我们应用程序的类加载器被破坏了。不幸的是,Java 虚拟机不允许第二个类加载器再次重新加载 DLL。

我认为可以创建一个加载 DLL 的 Jar 文件并将其添加到 Tomcat 本身的类路径中,而不是将其添加到我们的应用程序中。通常 Tomcat 有一个“共享”目录,可以在其中添加此类 jar 文件,这些文件将由所有应用程序共享。

演示:

1.将jar范围更改为provided,使其只能在编译时使用。

        <dependency>
            <groupId>com.eclipsesource.j2v8</groupId>
            <artifactId>j2v8_win32_x86_64</artifactId>
            <version>3.1.6</version>
            <scope>provided</scope>
        </dependency>
  1. 在 tomcat 文件夹中创建一个“共享”文件夹

  2. 将 j2v8_win32_x86_64-3.1.6.jar 粘贴到共享文件夹

  3. 将${catalina.home}/shared/*.jar附加到catalina.properties中的shared.loader属性

参考 :

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

于 2016-04-01T11:36:17.767 回答