【问题标题】:Exclude local WEB-INF/lib jars from packaged war file从打包的war文件中排除本地WEB-INF/lib jars
【发布时间】:2015-09-18 14:58:38
【问题描述】:

我已经在 pom.xml 中提到了所有必需 JAR 的依赖关系。现在,由于在 POM 中定义了依赖项,JAR 将自动打包到 lib 文件夹中。

我想排除项目源中存在的库中的所有 JAR。 在构建 WAR 时,依赖项 JAR 应该打包在 lib 中

我正在使用包装排除标签,以排除本地罐子。但它排除了打包的war文件中的所有jar。我想只包含 maven 依赖项。

                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.4</version>
                        <configuration>
                            <warSourceDirectory>WebContent</warSourceDirectory>
                            <warName>${war.name}</warName>
                            <webResources>
                                <resource>
                                    <directory>config</directory>
                                    <targetPath>WEB-INF/classes</targetPath>
                                    <directory>${maven.lib.dir}</directory>
                                    <targetPath>WEB-INF/lib</targetPath>                                
                                </resource>                                                                             
                            </webResources>
                            <archive>
                                <manifestEntries>
                                    <Built-Date>${maven.build.timestamp}</Built-Date>
                                </manifestEntries>
                            </archive>
                            <packagingExcludes>META-INF/*.xml</packagingExcludes>                           
                            <packagingExcludes>WEB-INF/*lib/</packagingExcludes>
                        </configuration>
                    </plugin>       

我可以通过在 excludes 标记中指定名称来排除几个 jar。但是我有太多的罐子要明确写在排除标签下

<packagingExcludes>
        WEB-INF/lib/commons-logging-*.jar,
        %regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]
      </packagingExcludes>

我需要一些配置,我可以在其中排除整个文件夹

【问题讨论】:

  • 为什么不直接删除 lib 文件夹? Maven 会在构建时为您添加它们,对于 IDE 解析,您应该使用 WTP-M2E 连接器到 Eclipse 中的 M2E 插件,将它们添加到项目库中。
  • 我无法删除 lib 文件夹。因为我正在处理一个遗留项目。只有在 maven 构建稳定后,我才会删除 lib 文件夹。
  • 您是否尝试过官方文档:maven.apache.org/plugins/maven-war-plugin/examples/… 页面中的第一个示例
  • 我可以通过在 excludes 标签中指定名称来排除几个罐子。但是我有太多的罐子要明确写在排除标签下。
  • 但是此页面上的第一个示例排除了 WEB-INF/lib 中的所有 jar,即:WEB-INF/lib/*.jar* 是替换 jar 名称的通配符。

标签: java eclipse maven jar


【解决方案1】:

只需为依赖设置&lt;scope&gt;provided&lt;/scope&gt;,它就不会被打包成war。见more about maven scopes

如果您需要从 WAR 文件中排除某些文件,请使用 packagingExcludes。文件不会包含在最终战争中,但仍然存在于webappDirectory(构建 webapp 的目录)中。

Maven WAR Plugin reference中所述:

在 WAR 中包含和排除文件

可以通过使用 和 配置参数在 WAR 文件中包含或排除某些文件。它们每个都采用逗号分隔的 Ant 文件集模式列表。您可以使用通配符,例如 ** 表示多个目录,使用 * 表示文件或目录名称的可选部分。

这是一个我们从 WEB-INF/lib 中排除所有 JAR 文件的示例:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

【讨论】:

  • 我不想将 maven 依赖项排除在战争之外。我只想排除在 WEB-INF/lib 中检查的本地 jar。
  • 如果您在项目中使用了一些 jar - 这是依赖项。不要将它们签入 WEB-INF/lib 使用 maven 存储库。或者只是放到 src/main/webapp 之外的不同文件夹
  • 我正在处理遗留产品。我无法对现有结构或文件夹进行任何更改。我只是迁移到 Maven。一旦一切看起来稳定,我将删除 WEB-INF/lib 文件夹中的检查。
  • packagingExcludes 应该做你需要的。只是不要混淆排除的罐子仍在webappDirectory 中。他们被排除在最后的战争之外。
  • 是的,packagingExcludes 从通常称为 Skinny Wars 的最终 War 文件中排除所有 jar。但在这里我的目标不是从最终的战争文件中排除所有的罐子。我只想要我的 pom.xml 中提到的 Maven 依赖项。 xml 成为我战争的一部分,并签入 WEB-INF/lib 文件夹中的本地 jars 以被排除。
【解决方案2】:

我已经解决了这个问题。我将 lib 文件夹重命名为 ant-libs,然后将其从打包中排除。创建战争后,我将 ant-libs 文件夹重命名为 lib。

Maven coderplus 插件:

              <plugin>
                <groupId>com.coderplus.maven.plugins</groupId>
                <artifactId>copy-rename-maven-plugin</artifactId>
                <version>1.0.1</version>
                <executions>
                  <execution>
                    <id>rename-file</id>
                    <phase>compile</phase>
                    <goals>
                      <goal>rename</goal>
                    </goals>
                    <configuration>
                      <sourceFile>${basedir}/WebContent/WEB-INF/lib</sourceFile>
                      <destinationFile>${basedir}/WebContent/WEB-INF/ant-libs</destinationFile>
                    </configuration>
                  </execution>
                  <execution>
                    <id>rename-file-back</id>
                    <phase>package</phase>
                    <goals>
                      <goal>rename</goal>
                    </goals>
                    <configuration>
                      <sourceFile>${basedir}/WebContent/WEB-INF/ant-libs</sourceFile>
                      <destinationFile>${basedir}/WebContent/WEB-INF/lib</destinationFile>
                    </configuration>
                  </execution>
                </executions>
              </plugin>

Maven 战争插件:

                 <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <warSourceDirectory>WebContent</warSourceDirectory>
                        <warName>${war.name}</warName>
                        <webResources>
                            <resource>
                                <directory>config</directory>
                                <targetPath>WEB-INF/classes</targetPath>                                    
                            </resource>
                            <resource>
                            <directory>${maven.lib.dir}</directory>
                            <targetPath>WEB-INF/lib</targetPath>
                            </resource> 
                        </webResources>
                        <archive>
                            <manifestEntries>
                                <Built-Date>${maven.build.timestamp}</Built-Date>
                            </manifestEntries>
                        </archive>
                        <packagingExcludes>WEB-INF/*ant-libs/</packagingExcludes>
                    </configuration>
                </plugin>

【讨论】:

    【解决方案3】:

    我终于(经过几次修改)理解了您的问题。不幸的是,我认为如果没有你称之为黑客的东西,这将是非常困难的。这很难,因为 Maven 并不真正支持手动添加的 jar。这被认为是不好的做法,但我们尝试对此做一些事情。您可以这样做:

    1. 将 maven 依赖项复制到某个临时目录
    2. 将子目录插入WEB-INF/lib
    3. WEB-INF/lib 中删除每个*.jar,但不要从子目录中删除。

    这里有更详细的步骤:

    首先将复制依赖项添加到某个临时目录(在我的情况下是 maven-deps)

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <outputDirectory>${project.build.directory}/maven-deps</outputDirectory>
                    <overWriteReleases>false</overWriteReleases>
                    <overWriteSnapshots>false</overWriteSnapshots>
                    <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    请记住,在Eclipse IDE 中打开&lt;execution&gt; 时会出现错误,但是从工具提示菜单中,您可以通过从市场安装m2e 连接器来解决它(此插件默认不包括在内-循环。这就是你需要连接器的原因。

    之后我们需要告诉 maven 把这个目录放到war 下的WEB-INF/lib 下。执行以下操作:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
    
            <webResources>
                <resource>
                    <directory>target/maven-deps</directory>
                    <includes>
                        <include>*.jar</include>
                    </includes>
                    <targetPath>WEB-INF/lib/maven-deps</targetPath>
                </resource>
            </webResources>
        </configuration>
    </plugin>
    

    这会将目录maven-deps 作为子目录插入WEB-INF/lib,并从WEB-INF/lib 中排除每个*.jar,但从WEB-INF/lib/maven-deps 中排除NOT

    这样您将仅在 WEB-INF/lib/maven-deps 中获得 maven 托管依赖项,根据规范,这应该可以从 war 类加载器中看到,因为类加载器应该从 WEB-INF/lib 加载所有 jar 及其子目录。

    我知道这是一种 hack,但目前我想不出更好的解决方案。

    【讨论】:

    • 感谢您的回复,我已经解决了这个问题。我将 lib 文件夹重命名为 ant-libs,然后将其从打包中排除。创建战争后,我将 ant-libs 文件夹重命名为 lib。
    猜你喜欢
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多