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 - 包括未打包的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

maven中jar和war的区别

eclipse maven打包war

Maven学习 七 Maven项目创建war项目

如何使用maven创建.war文件?

Eclipse中打包maven项目-war包方式

工程目录 Java/Web/Maven