是否有任何类似于'dist'的maven目标?

时间:2010-11-22 13:41:24

标签: maven-2

我正在开发一个使用ant的项目。我有一个基本上dist的目标jar,然后将应用程序安装到目录中。

这意味着,它会在安装目录中创建bin/lib/config/等目录,然后将相关文件复制到每个目录中。

我的问题是双重的:

  1. 是否有任何maven目标可以做这种事情?
  2. 如果没有,我想做maven dist并实现这一目标。您如何建议我使用Maven完成此任务?
  3. 如果我不能拥有自己的“目标”(如dist),那么最好的方法是什么?
  4. 底线:我想做所有这些,但不想改变默认“目标”的行为,如编译和打包等。

    谢谢, JRH

    PS:我正在使用maven版本2.2.21

4 个答案:

答案 0 :(得分:7)

我不知道config会发生什么,但libbin很容易。

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} },validateinitializegenerate-sourcesprocess-sourcesgenerate-resourcesprocess-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 ,正如肖恩所建议的那样。

相关问题