【问题标题】:Why can't I pack certain JARs outside WEB-INF为什么我不能在 WEB-INF 之外打包某些 JAR
【发布时间】:2016-02-10 12:38:21
【问题描述】:

我在几个博客中读到不建议(或不可能)将 jar 打包到 WEB-INF 文件夹之外。我很想知道为什么会这样..

例如,

mainStuff.war
|
|-->WEB-INF
|   |
|   |-->lib     (having many jars, used by the contents of specificStuff.jar
|   |-->classes
|   |-->web.xml
|
|-->META-INF        (having the .MF file and signed files .SF and .DSA)
|
|
|-->index.jsp       (consists of a jnlp xml, referring to the jars in lib)
|
|
|-->specificStuff.jar   (this is a separate jar module, which is mentioned in the POM of the war)

在 index.jsp 中的 jnlp 配置中,我指的是 lib 中的 jar,例如:

  <resources>     
    <java version="1.6+"/>
    <jar href="specificStuff.jar"/> 
    <jar href="lib/someJarthatIneed.jar"/>
  </resources>     

现在,当我启动 JNLP 时,我收到 someJarthatIneed 无法加载的错误。但是,当我手动将 lib 移到 WEB-INF 之外时,没有发生此错误。

所以,我需要知道的是,有没有办法打包 lib 文件夹和 WEB-INF 之外的所有 jar? 或者 为什么我的 jnlp(位于 WEB-INF 之外)无法从 WEB-INF/lib 加载 jar。 (我尝试将 jar 的路径更改为

<jar href="WEB-INF/lib/someJarthatIneed.jar"/>

但它也不起作用..)

对此的任何帮助将不胜感激。 :)

【问题讨论】:

  • 部署模型不清楚。您是否有提供可下载代码的 WAR 文件以通过 JNLP 安装?还是要通过 JNLP 安装 WAR 文件本身?
  • 您为什么要这样做?绝对没有理由这样做。这就是为什么你会发现很难做到……
  • 其实specificStuff.jar是通过jnlp下载的真实应用。这个 jar 的所有依赖项都放在 lib 文件夹中。此外,整个战争本身都包含在一个 EAR 中——(认为在上述上下文中这个重要的信息不需要此信息)

标签: maven pom.xml java-web-start jnlp


【解决方案1】:

感谢所有建议...但是,我找到了一种方法..

我使用了maven-dependency-plugin(copy-dependencies)将所有依赖jar复制到一个文件夹lib到指定位置。

<plugin>      
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}/src/main/webapp/lib</outputDirectory>
                <includeScope>compile</includeScope>
            </configuration>
        </execution>
    </executions>
</plugin> 

然后使用

  <packagingExcludes>WEB-INF/lib/</packagingExcludes>

在使用 maven-war-plugin 进行战争的 pom 中,从 WEB-INF 中删除 lib 文件夹。

所以,现在 index.jsp 能够从 lib 中获取所有 jar。

【讨论】:

    【解决方案2】:

    WEB-INF 中的内容在 http 请求中是不可用的,WEB-INF 中没有的将被视为资源,因此不会被容器加载。

    如果您的应用程序不需要您放入 WEB-INF/lib 中的 jar,只需将它们移到 WEB-INF 文件夹之外,它们将被视为资源。

    您还可以考虑为您的 JNLP jar 构建一个“uberjar”,将所有依赖项打包到一个 jar 中。

    【讨论】:

    • 感谢您的回复...我正在考虑构建 UBERJAR.. 但是,我是否也可以使用 jarsigner 对 uberjar 中的所有 jar 进行签名?另外,是否可以从具有所有 jnlp 配置的 index.jsp 访问这些 jar?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多