Maven WAR依赖
我正在编写一个验收testing项目,由于各种原因,这取决于另一个打包为WAR的项目。 我已经设法使用maven-dependency-plugin解压缩WAR,但是我不能让我的项目包含解压后的WEB-INF/lib/*.jar
和WEB-INF/classes/*
以包含在classpath中,所以构build失败。 有没有办法将这些文件包含到类path中,还是有更好的方法来取决于WAR?
非常感谢。
自从maven-war-plugin 2.1-alpha-2以来,还有另一种select。 在你的WAR项目中:
<plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <attachClasses>true</attachClasses> </configuration> </plugin>
这会创build一个类别工件,您可以在验收testing项目中使用它:
<dependency> <groupId>your-group-id</groupId> <artifactId>your-artifact-id</artifactId> <version>your-version</version> <classifier>classes</classifier> </dependency>
事实上,Maven并没有devise出一个声明为项目依赖的战争的传递依赖关系。 实际上有一个关于MNG-1991的问题 ,但在Maven 2.x中不会解决,我不知道是否我不知道覆盖是否允许解决这个问题。 我对build议的解决scheme的理解是复制依赖项,例如在types为pom的项目中。
(编辑:经过一些挖掘,我发现这个线程中有趣的东西,我在下面引用:
上个月我一直在帮助开发AppFuse项目,我们在Maven war插件中大量使用战争覆盖function。 这是一个非常漂亮的function!
为了通过战争覆盖获得最大的力量,我开发了Warpath插件,允许项目使用战争工件作为完全成熟的依赖关系。 简单来说:
1)war依赖项构件中的/ WEB-INF / classes目录的内容可以包含在项目的类path中,用于正常编译等任务。
2)来自战争依赖项构件的传递依赖性可供其他插件使用,例如编译和耳朵 – 所以在创build瘦战争时不需要包含所有的依赖关系。现在这个插件在过去的几个月里已经在AppFuse项目中得到了积极的使用,我觉得它正处于可用和稳定的阶段。 战争插件团队是否有兴趣在war插件中包含warpathfunction? 它似乎是主办它最自然的地方。
所以,我没有任何经验,但maven warpath插件实际上看起来不错,简单,可在中央回购。 要使用它,请在您的pom.xml
文件中包含以下插件configuration元素:
[...] <build> <plugins> <plugin> <groupId>org.appfuse</groupId> <artifactId>maven-warpath-plugin</artifactId> <version>1.0-SNAPSHOT</version> <extensions>true</extensions> <executions> <execution> <goals> <goal>add-classes</goal> </goals> </execution> </executions> </plugin> </plugins> </build> [...]
并且将你想要包含在类path中的战争依赖添加为战争pathtypes依赖:
[...] <dependencies> <dependency> <groupId>org.appfuse</groupId> <artifactId>appfuse-web</artifactId> <version>2.0</version> <type>war</type> </dependency> <dependency> <groupId>org.appfuse</groupId> <artifactId>appfuse-web</artifactId> <version>2.0</version> <type>warpath</type> </dependency> </dependencies> [...]
战争和战争path依赖types都是必需的:战争types被Maven战争插件用于战争覆盖,战争pathtypes被Warpath插件用来确定包含在项目类path中的正确工件列表。
我会试试看。)
使用重叠 。 首先,你的testing项目也需要打包war
。
声明你想testing的战争项目的依赖:
<dependency> <groupId>${project.groupId}</groupId> <artifactId>your-project-arftifactId</artifactId> <version>${project.version}</version> <type>war</type> <scope>test</scope> </dependency>
然后configurationmaven-war-plugin覆盖:
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <resource> <directory>${basedir}/src/main/webresources</directory> <filtering>true</filtering> </resource> </webResources> <overlays> <overlay/> <overlay> <groupId>your.group</groupId> <artifactId>your-project-artifactId</artifactId> </overlay> </overlays> </configuration> </plugin>
在上面的例子中,我在testing项目中覆盖了webresources的configuration文件(如conxtext等)。
编辑:这个解决scheme没有用Maven 3进行testing。
好,贾斯汀。 这让我真正解决了我的问题,即:将一场战争包括在一个集合中,并包括它的所有传递依赖。 我不能像你所说的那样将war依赖作为“jar”来复制,因为程序集插件找不到那个groupId / artefactId引用的jar,
- 复制战争依赖types为pom
作品! 战争及其传递依赖不包括在大会。 要排除(现在也出现)的POM文件,我不得不像这样添加一个排除元素:
<excludes> <exclude>*:pom</exclude> </excludes>
到我的assembly.xml文件。
我认为这也可能是对这个线程的原始问题的解决方法。
如果你列出战争项目的依赖关系作为jar依赖,它似乎拾取所需的jar子/资源。 我正在使用Maven 2.2 + m2eclipse。