我正在开发一个使用ant
的项目。我有一个基本上dist
的目标jar
,然后将应用程序安装到目录中。
这意味着,它会在安装目录中创建bin/
,lib/
和config/
等目录,然后将相关文件复制到每个目录中。
我的问题是双重的:
maven dist
并实现这一目标。您如何建议我使用Maven完成此任务?底线:我想做所有这些,但不想改变默认“目标”的行为,如编译和打包等。
谢谢, JRH
PS:我正在使用maven版本2.2.21
答案 0 :(得分:7)
我不知道config
会发生什么,但lib
和bin
很容易。
到copy all dependencies to a folder只需执行此操作:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/dist/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
要将jar输出到bin文件夹,请执行此操作(reference page):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}</finalName>
<outputDirectory>${project.build.directory}/dist/bin</outputDirectory>
</configuration>
</plugin>
啊,还有其他要求:
底线:我想做所有这些,但不想改变默认“目标”的行为,如编译和打包等。
在这种情况下,我会使用个人资料启用此功能:
<profile>
<id>dist</profile>
<build>
<plugins>
<!-- insert stuff from above here -->
</plugins>
</build>
</profile>
现在你要mvn clean package -Pdist
来获取你的dist目录,如果你不添加配置文件,你会得到默认行为。
基本上,maven的工作方式与他们在ant中的工作方式不同。没有目标,只有生命周期阶段和插件目标。
您可以执行生命周期阶段,该阶段将调用绑定到此阶段的所有阶段的所有maven插件目标(例如,如果您执行mvn compile
,将执行以下阶段:{{1} },validate
,initialize
,generate-sources
,process-sources
,generate-resources
,process-resources
)。但是没有(简单的)方法来定义名为compile
的生命周期阶段。
或者您可以执行特定的插件目标(您实际上可以执行多个阶段和/或插件目标)。例如。您可以编写自己的dist插件并使用dist
调用它,但我不建议这样做,因为您使用的是现有功能,并且配置文件解决方案应该非常合适。
答案 1 :(得分:1)
您可以尝试为assembly descriptor撰写assembly plugin(或在Google上搜索合适的内容)。
像这样的东西
<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>dist</id>
<formats><format>zip</format></formats>
<fileSets>
<fileSet>
<directory>src/main/config</directory>
<outputDirectory>config</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
<files>
<file>
<source>${project.build.directory}/${project.artifactId}.jar</source>
</file>
</files>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
将在${project.artifactId}-dist.zip
目录中创建target
。 zip文件将像
yourProjectName/
yourProjectName/config/...
yourProjectName/lib/...
yourProjectName/${project.artifactId}.jar
看起来程序集插件只会创建压缩文件,它不会只是将它们复制到dist
文件夹。
答案 2 :(得分:1)
Seans的答案很好,我差不多去了,直到我发现了appassembler插件http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/。
请点击此处查看示例https://github.com/khmarbaise/maven-training/tree/master/502-assembly-plugin
它被称为包生命周期的一部分。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>assemble</goal>
</goals>
</execution>
</executions>
<configuration>
<binPrefix>utility</binPrefix>
<assembleDirectory>${project.build.directory}/appassembler</assembleDirectory>
<extraJvmArguments>-Xms512m -Xmx1024m</extraJvmArguments>
<generateRepository>false</generateRepository>
<repositoryName>lib</repositoryName>
<repositoryLayout>flat</repositoryLayout>
<includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
<platforms>
<platform>windows</platform>
<platform>unix</platform>
</platforms>
<programs>
<program>
<mainClass>com.soebes.tools.cli.UtilityCLI</mainClass>
<name>utility</name>
</program>
</programs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/bin.xml</descriptor>
<descriptor>src/main/assembly/bin-unix.xml</descriptor>
<descriptor>src/main/assembly/src.xml</descriptor>
</descriptors>
<tarLongFileMode>gnu</tarLongFileMode>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
它引用的描述符非常简单,它还为您创建了一个批处理和shell脚本来运行您的应用程序!
答案 3 :(得分:0)
您不能拥有maven dist
,使用NetBeans(以及我认为的其他IDE),您可以创建custom action dist
,其执行时间为mvn install -Pdist
(或mvn clean package -Pdist
,正如肖恩所建议的那样。