[英]Exclude local WEB-INF/lib jars from packaged war file
我已经在pom.xml中提到了所有必需JAR的依赖关系。 现在,由于依赖项是在POM中定义的,因此JAR文件将自动打包在lib文件夹中。
我想排除项目源中存在的lib中的所有JAR。 在构建WAR时,应将Dependency JAR打包在lib中
我正在使用包装excludes标签 ,以排除本地jar。 但是它不包括打包的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。 但是我有太多罐子无法在excludes标签下显式编写
<packagingExcludes>
WEB-INF/lib/commons-logging-*.jar,
%regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]
</packagingExcludes>
我需要一些配置,在其中我可以排除整个文件夹 。
我终于(经过几次编辑)终于明白了您的问题。 不幸的是,我认为如果没有所谓的hack很难做到。 这很困难,因为maven并不真正支持手动添加的jar。 这被认为是不好的做法,但我们会尝试对此做一些事情。 您可以执行以下操作:
WEB-INF/lib
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
连接器来解决此问题(默认生命周期未涵盖此插件。因此,您需要连接器)。
之后,我们需要告诉行家到这个目录下投入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
排除
这样,您将只在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 War插件:
<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范围
如果需要从WAR文件中排除某些文件,请使用packagingExcludes
。 文件不会包含在最终战争中,但仍会存在于webappDirectory
(构建webapp的目录)中。
包含和排除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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.