在大会中包括一个解压缩的战争

时间:2014-12-17 15:33:37

标签: maven maven-assembly-plugin unpack

我有一个建立战争的项目(没问题)。并且,该战争需要与一些shell脚本打包在一起。因为该战争包含不同站点之间的属性文件,我们不能简单地安装战争,而是将其中的属性文件进行处理。这就是shell脚本的作用。

我想把我的战争打包在我的集会中作为一个解包的战争。我在大会描述符中看到<unpacked>,但我还没有能够让它工作。

这是我的第一个bin.xml我刚刚打包战争的地方。这很好用:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/assembly/scripts</directory>
            <includes>
                <include>deploy.sh</include>
                <include>lock_build.sh</include>
                <include>description.sh</include>
                <include>url-encode.pl</include>
            </includes>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}/${project.artifactId}-${project.version}</directory>
            <outputDirectory>${project.artifactId}</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

这是我第一次尝试解压缩:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/assembly/scripts</directory>
            <includes>
                <include>deploy.sh</include>
                <include>lock_build.sh</include>
                <include>description.sh</include>
                <include>url-encode.pl</include>
            </includes>
            <outputDirectory>/</outputDirectory>
       </fileSet>
    </fileSets>
    <moduleSets>
        <moduleSet>
            <includes>
                <include>{$project.groupId}:${project.artifactId}:war</include>
            </includes>
            <binaries>
                <includes>
                    <include>${project.build.directory}-${project.artifactId}-${project.version}.${project.packaging}</include>
                </includes>
                <outputDirectory>${project.artifactId}</outputDirectory>
                <unpack>true</unpack>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

这是我最后一次尝试获得解压缩的战争:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/assembly/scripts</directory>
            <includes>
                <include>deploy.sh</include>
                <include>lock_build.sh</include>
                <include>description.sh</include>
                <include>url-encode.pl</include>
            </includes>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
    <moduleSets>
        <moduleSet>
            <binaries>
                <attachmentClassifier>war</attachmentClassifier>
                <outputDirectory>${project.artifactId}</outputDirectory>
                <unpack>true</unpack>
                <includeDependencies>true</includeDependencies>
                <dependencySets>
                    <dependencySet/>
                </dependencySets>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

在最后两次尝试的每次尝试中,我只是打包脚本而且战争还没有结束。

我知道我可以使用包含战争中几乎所有文件的${project.build.directory}/${project.artifactId}-${project.version}目录,但它不包含我的MANIFEST.MF条目,其中包含将战争与战争联系起来的信息特别是Jenkins构建和Subversion修订。

我需要做些什么才能将未打包的战争纳入我的装配?


另一种尝试

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/assembly/scripts</directory>
            <includes>
                <include>deploy.sh</include>
                <include>lock_build.sh</include>
                <include>description.sh</include>
                <include>url-encode.pl</include>
            </includes>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>${project.artifactId}</outputDirectory>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

当我跑步时,我得到了:

[INFO] ------------------------------------------------------------------------
[INFO] Building My Project 1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-assembly-plugin:2.5.2:single (default-cli) @ myproj ---
[INFO] Reading assembly descriptor: src/assembly/bin.xml
[WARNING] Cannot include project artifact: \
          com.vegicorp:myproj:war:1.0.0; \
          it doesn't have an associated file or directory.
[INFO] Building zip: ~/workdir/trunk/myproj/target/archive/myproj.zip
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

在拉链里面是战争中的所有罐子都很好并且没有包装,但不是我的解包战争。

1 个答案:

答案 0 :(得分:2)

我知道我 应该 能够将解压后的战争添加到我的程序集中。我看到unpack选项,我知道它适用于其他依赖项。但是,我似乎只能通过<dependencySet><moduleSet>访问它。我 应该 能够将我的项目指定为自己的模块。肯定有一些我做错了。


脾脏通气孔

这是我讨厌Maven的重要事情:Maven很好地隐藏了你的东西,这很好,因为它阻止你做你不应该做的事情。我讨厌开发人员构建Ant build.xml文件时,因为大多数开发人员不了解如何进行构建,而build.xml变得难以理解。对于Maven,这不是问题。只需配置您的项目,Maven将为您处理此事。

但有时Maven就像一个带有一堆杠杆和按钮的黑匣子。你坐在那里推拉杠杆和按钮试图弄清楚如何让它做你想做的事情。我花了太多时间试图帮助开发人员配置他们的Maven项目。他们想要做一些有点不同的事情,比如使用hibernate或者从WSDL文件构建源代码,并且不知道如何让Maven做他们想做的事。

一位开发商将其描述为一辆自动驾驶汽车,无法完全按照自己的意愿行驶。你甚至可以看到窗外的目的地,但你无法弄清楚如何操纵汽车的目的地来到那里。

我想做的事应该很简单。我只是想创建一个程序集,而不是使用打包的war文件,我希望它解压缩。

在Ant中,这可以在一个任务中完成。在Maven,这是一个神秘的过程。我想我很接近,我可能错过了一个小配置参数,这将使它全部工作,但我已经花了几个小时研究这个。


我最终做了什么

我用maven-dependency-plugin打开了我的战争。我不确定这是否会起作用,因为我不希望依赖插件下载战争,但它似乎明白,当我指定我的战争时,我说的是当前的构建,并没有下载任何内容。 (我甚至没有Maven回购中的战争。)

我还必须将Maven从2.x升级到3.x,因为我需要确保maven-dependency-pluginmaven-assembly-plugin之前运行。由于两者都在构建的打包阶段运行,因此Maven 2.x无法保证插件的运行顺序。

一旦我使用了这个插件,我所要做的就是指定我在程序集插件中解压缩war的目录,它包含在我的zip中。

我仍然想知道如何在程序集插件中使用<unpack>实体,而不必使用另一个插件来解压缩我的战争。如果有人可以告诉我如何在汇编文件中解压缩,我会将其标记为正确的答案。

的pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.9</version>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>package</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/unwar/${project.artifactId}</outputDirectory>
                <artifactItems>
                    <artifactItem>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <type>war</type>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.2</version>
    <configuration>
        <finalName>${project.artifactId}</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <outputDirectory>${project.build.directory}/archive</outputDirectory>
        <descriptors>
            <descriptor>src/assembly/bin.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

bin.xml(我的程序集)

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/assembly/scripts</directory>
            <fileMode>0755</fileMode>
            <lineEnding>lf</lineEnding>
            <includes>
                <include>deploy.sh</include>
                <include>lock_build.sh</include>
                <include>description.sh</include>
                <include>url-encode.pl</include>
            </includes>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}/unwar</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

实际答案

感谢khmarbaise的链接(请参阅下面的评论),我复制了该项目的程序集插件,几乎工作。就像我的尝试一样,它解压缩了所有的运行时jar,而不仅仅是我想要的那个。然而,它也解开了我的战争。

该链接的答案与我的尝试之间只有两个不同之处:

  • 他们包括<useProjectArtifact>true</useProjectArtifact>而我没有。但是,默认为true。删除它仍然允许它工作。
  • 他们在/的目录名称前面加了一个<outputDirectory>。删除它没有任何区别。

这意味着它现在与我之前尝试的相匹配。所以,这次为什么会这样。

事实证明,我只是通过运行mvn assembly:single来测试装配更改。毕竟,当我只是想让装配工作时,为什么整个构建和重新包装。当您只运行mvn assembly:single时 - 即使所有内容都已打包,也会出现此错误:

[WARNING] Cannot include project artifact: \
      com.vegicorp:myproj:war:1.0.0; \
      it doesn't have an associated file or directory.

你的战争没有解开。但是,如果您将程序集放入程序包阶段,然后运行mvn package,那么一切都很有效。

然后我花了很多时间试图让我的战争,而不是所有相关的运行时东西。我使用<includes/>来执行此操作,但因为我有战争而不是jar,所以我必须在<include>中添加分类器。

最后,我把一切都搞定了。我在集会中有这个:

<dependencySets>
    <dependencySet>
        <outputDirectory>${project.artifactId}</outputDirectory>
        <unpack>true</unpack>
        <scope>runtime</scope>
        <includes>
            <include>${project.groupId}:${project.artifactId}:*:${project.version}</include>
        </includes>
    </dependencySet>
</dependencySets>

只要我运行mvn package,就可以了。

这比我对maven-dependency-plugin的方法更好。现在,与程序集有关的所有信息都在汇编XML文件中。