Maven WAR Overlays - 包括未打包的依赖项
Posted
技术标签:
【中文标题】Maven WAR Overlays - 包括未打包的依赖项【英文标题】:Maven WAR Overlays - including unpacked dependencies 【发布时间】:2010-11-04 14:07:52 【问题描述】:我正在尝试使用 Maven 设置一个项目,但对于如何包含一些需要在生成的 war 文件中解包的第三方依赖项感到有点困惑。
我的项目包含一些自定义 ColdFusion 代码并包含 Java 依赖项,包括打包为 war 文件的 ColdFusion。然后,我尝试包含一些第 3 方 ColdFusion 代码,这些代码已安装在打包为 jar 的我的 maven 存储库中,但我实际上想将其解包后部署到生成的 war 文件中。这是我坚持的第 3 方库的解包。我真的希望在构建战争之前完成此操作,以便我可以在开发过程中使用 war:exploded。
目前我的 pom.xml 看起来像这样:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- This is the war overlay -->
<dependency>
<groupId>com.adobe.coldfusion</groupId>
<artifactId>coldfusion</artifactId>
<version>9.0.1</version>
<type>war</type>
<scope>runtime</scope>
<optional>false</optional>
</dependency>
<!-- This is the 3rd party ColdFusion dependency -->
<dependency>
<groupId>org.corfield</groupId>
<artifactId>fw1</artifactId>
<version>1.2RC2A</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>my-webapp</finalName>
</build>
</project>
通过如下修改构建部分,我已经完成了我想做的事情:
<build>
<finalName>$project.artifactId</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.corfield</groupId>
<artifactId>fw1</artifactId>
<version>1.2RC2A</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>$project.build.directory/$project.artifactId</outputDirectory>
<includes>**/*.cfc</includes>
</artifactItem>
</artifactItems>
<includes>**/*.cfc</includes>
<outputDirectory>$project.build.directory/$project.artifactId</outputDirectory>
<overWriteReleases>false</overWriteReleases>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
问题在于 package:unpack 发生在 war 构建之后,因此解压后的依赖项不在生成的 war 文件中。
我还尝试了一些关于程序集插件的事情,并且通过使用类似这样的东西我也非常接近:
<assembly>
<id>$project.artifactId</id>
<formats>
<format>war</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<includes>
<include>org.corfield:fw1</include>
</includes>
<unpack>true</unpack>
<outputDirectory>/</outputDirectory>
</dependencySet>
<dependencySet>
<excludes>
<exclude>org.corfield:fw1</exclude>
</excludes>
<unpack>false</unpack>
<outputDirectory>/WEB-INF/lib</outputDirectory>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>src/main/webapp</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
但是,这会创建第二个名为 my-webapp-1.0-SNAPSHOT-my-webapp.war 和 my-webapp-1.0-SNAPSHOT.war 的 war 文件。 my-webapp-1.0-SNAPSHOT-my-webapp.war 还包括 my-webapp-1.0-SNAPSHOT.war
在一天结束时,我希望我的最终战争看起来像:
org
|-- corfield
|-- framework.cfc
WEB-INF
|-- lib
|-- web.xml
index.cfm
(实际上还有很多事情要做,但这足以说明这一点)
我想我已经很接近了,但我只是缺少一些我需要的东西。如果能提供任何帮助,我将不胜感激。
【问题讨论】:
【参考方案1】:对于maven-dependency-plugin
方法,将unpack
目标绑定到prepare-package
阶段(Maven 2.1+)而不是package
。
参考文献
Lifecycle Reference【讨论】:
@AndrewMyers:不客气。以防万一,看看this blog(虽然我没有测试这个m2eclipse扩展)。 我没有看到 - 看起来非常有希望。我现在就去看看!谢谢!【参考方案2】:您是否看过overlay 选项和maven-war-plugin?它本质上允许您在站点布局上解开 ColdFusion 战争。我通过结合使用 ColdFusion 9.x 和 Struts2 完成了这项工作。只做一个 ColdFusion 覆盖应该让它变得非常容易。您可能想先创建 ColdFusion 战争。然后,您还可以控制 Maven 项目中的 neo-*.xml 文件。
【讨论】:
听起来你正在做我正在做的事情(尽管我使用的是 Spring,而不是 Struts)。我也在使用战争覆盖选项。感谢您的回答,但 Pascal Thivent 的答案是我正在寻找的答案。您出于兴趣使用什么IDE?我想我会选择 Intellij,因为 Eclipse 不支持 Maven Overlays,而 Netbeans 不支持 CF... 我大部分时间都使用命令行。您是否已将 m2eclipse 插件升级到 0.10.x。比0.9.x版本好多了。 是的,我已经尝试过 m2eclipse 0.10.x 和 IAM(以前称为 q4e)。 IAM 应该做战争覆盖,但我无法让它工作。 m2eclipse 没有,我也无法让 Pascal 链接到上面的扩展工作。整个事情非常混乱。 您运行的是哪个版本的 Maven? 2.2.x?以及你指定了哪个版本的maven war插件?看起来您至少需要为 war 插件指定 2.1-alpha-1。以上是关于Maven WAR Overlays - 包括未打包的依赖项的主要内容,如果未能解决你的问题,请参考以下文章