从打包的war文件中排除本地WEB-INF/lib jar



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

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

我使用包装排除标签,以排除本地罐子。但它排除了包装战争文件中的所有罐子。我只想包含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>

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

我终于(经过几次编辑)理解了你的问题。不幸的是,我认为如果没有你称之为黑客的东西,这将是非常困难的。这很难,因为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中,打开<execution>时会出现错误,但从工具提示菜单中,您可以通过从市场上安装m2e连接器来解决此问题(此插件不在默认生命周期内。这就是为什么您需要连接器)。

之后,我们需要告诉maven将此目录放入WEB-INF/lib下的war中。执行以下操作:

<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。

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

我有一个解决办法。我将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>

只需为依赖项设置<scope>provided</scope>,它就不会被打包成war。查看更多关于maven scopes 的信息

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

如Maven WAR插件参考中所述:

从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>

最新更新