我已经提到了pom.xml中所有必需JAR的依赖关系。现在,由于依赖关系在 POM 中定义,JAR将自动打包到lib文件夹中。
我想排除项目源中存在的lib中的所有JAR。 在构建WAR
时,应将依赖JAR包装在lib中我正在使用打包排除标记 strong>,以排除本地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标签中指定名称来排除几个罐子。但我有太多的罐子要在exludes标签下明确写出
<packagingExcludes>
WEB-INF/lib/commons-logging-*.jar,
%regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]
</packagingExcludes>
我需要一些配置,我可以在其中排除整个文件夹。
答案 0 :(得分:2)
我终于(经过少量编辑)了解你的问题。不幸的是,我觉得没有你称之为黑客的东西是非常困难的。这很难,因为maven并不真正支持手动添加的罐子。这被认为是不好的做法,但我们尝试做一些事情。您可以这样做:
WEB-INF/lib
*.jar
中删除每个WEB-INF/lib
,但不从子目录中删除。以下是更详细的步骤:
首先将copy-dependencies添加到某个临时目录(在我的例子中是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将此目录放在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
,并从*.jar
中排除WEB-INF/lib
WEB-INF/lib/maven-deps
,但从WEB-INF/lib/maven-deps
排除 NOT }
这样你只会在war
中获得maven托管依赖项,并且根据规范应该可以从WEB-INF/lib
类加载器中看到,因为类加载器应该从ForEach
加载所有jar并且它是子目录。
我知道这有点像黑客,但目前我无法想到更好的解决方案。
答案 1 :(得分:0)
我为此做了一个工作。我将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>
答案 2 :(得分:0)
只需为依赖项设置<scope>provided</scope>
,它就不会打包成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>