Maven:如何将工件复制到特定目录?

时间:2011-08-15 09:34:20

标签: java maven jboss

“安装”目标将工件复制到目标目录和本地存储库。

如何告诉Maven将复制到给定目录(例如JBoss的deploy目录)。

4 个答案:

答案 0 :(得分:17)

maven-dependency-plugin的目标copy可以满足您的需求,请参阅example

然而,复制目标目录之外的任何内容(或者精确地${project.build.directory})并不是一个好主意 - 特别是如果此类操作附加到构建阶段,因为它会引入构建的意外副作用,有时甚至会失去再现性。

正如@Andreas_D所说,JBoss部署目的有一个更好的选择;类似地,部署到其他appservers。

答案 1 :(得分:11)

根据http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html,您可以将刚构建的工件复制到特定目录:

<project>
    [...]
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
          <executions>
            <execution>
              <id>copy-installed</id>
              <phase>install</phase>
              <goals>
                <goal>copy</goal>
              </goals>
              <configuration>
                <artifactItems>
                  <artifactItem>
                    <groupId>${project.groupId}</groupId>
                    <artifactId>${project.artifactId}</artifactId>
                    <version>${project.version}</version>
                    <type>${project.packaging}</type>
                  </artifactItem>
                </artifactItems>
                <outputDirectory>some-other-place</outputDirectory>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
    [...]
  </project>

答案 2 :(得分:8)

如果要将文件复制到网络服务器(本地或远程),可以使用Maven上传插件:

                <plugin>
                    <groupId>com.atlassian.maven.plugins</groupId>
                    <artifactId>maven-upload-plugin</artifactId>
                    <version>1.1</version>
                    <configuration>
                        <resourceSrc>
                            ${project.build.directory}/${project.build.finalName}.${project.packaging}
                        </resourceSrc>
                        <resourceDest>${jboss.deployDir}</resourceDest>
                        <serverId>${jboss.host}</serverId>
                        <url>${jboss.deployUrl}</url>
                    </configuration>
                </plugin>

要以智能方式配置参数,我使用maven配置文件:

<profiles>
    <!-- local deployment -->
    <profile>
        <id>developpement</id>
        <properties>
            <jboss.host>localhost</jboss.host>
            <jboss.deployDir>appli/jboss-4.0.4.GA/server/default/deploy/</jboss.deployDir>
            <jboss.deployUrl>file://C:/</jboss.deployUrl>
        </properties>
    </profile>
    <!-- distant deployment -->
    <profile>
        <id>validation</id>
        <properties>
            <jboss.host>ENV_val</jboss.host>
            <jboss.deployDir>/home/envval/jboss/server/default/deploy/</jboss.deployDir>
            <jboss.deployUrl>scp://PROJECT_LAN_HOST</jboss.deployUrl>
        </properties>
    </profile>
</profiles>

我创建了一个“ant启动器”,通过在Eclipse ant视图下单击来使用它:

<target name="copy war to JBoss local" description="Copy war to local JBoss">
    <maven goal="upload:upload" options="-Pdeveloppement" />
</target>

但您可以在命令行上运行它:

mvn upload:upload -Pdeveloppement

顺便说一句,对于远程部署,您可能需要登录密码才能使用scp。您必须将它们添加到Maven settings.xml文件中:

<settings>
  ...
  <servers>
    <server>
      <id>ENV_val</id>
      <username>login</username>
      <password>password</password>
    </server>
  </servers>
  ...
</settings>

答案 3 :(得分:3)

最好的方法是使用实​​际部署应用程序的插件,例如cargojboss-maven plugin(对于那个应用程序归功于@Andreas_D)。

这是使用副本或通用上传工具的更好方法,因为部署是您实际尝试执行的操作。

使用货物插件,您可以选择deploy to a variety of running servers。我们采用这种方法在构建过程中使用jetty plugin在本地进行测试,并根据需要通过货物部署到tomcat。

注意:如果您在开发箱上本地安装了目标服务器(JBOSS),那么您也可以在构建过程中使用货物启动/停止服务器。这种方法的缺点是你需要它来引用它在pom文件中的位置,所以所有开发者都将它安装在相同的位置或系统属性中定义它所在的位置(类似于JAVA_HOME)。