我有一个建立战争的项目(没问题)。并且,该战争需要与一些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] ------------------------------------------------------------------------
在拉链里面是战争中的所有罐子都很好并且没有包装,但不是我的解包战争。
答案 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-plugin
在maven-assembly-plugin
之前运行。由于两者都在构建的打包阶段运行,因此Maven 2.x无法保证插件的运行顺序。
一旦我使用了这个插件,我所要做的就是指定我在程序集插件中解压缩war的目录,它包含在我的zip中。
我仍然想知道如何在程序集插件中使用<unpack>
实体,而不必使用另一个插件来解压缩我的战争。如果有人可以告诉我如何在汇编文件中解压缩,我会将其标记为正确的答案。
<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>
<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文件中。