【问题标题】:Maven: how to copy artifact to specific directory?Maven:如何将工件复制到特定目录?
【发布时间】:2011-10-27 04:02:10
【问题描述】:

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

我如何告诉 Maven 将它也复制到给定目录(例如 JBoss 的部署目录)。

【问题讨论】:

  • 对于 jboss,不需要复制文件来部署目录 - 有一个special maven plugin
  • 然而 jboss“特殊 maven 插件”的可靠性有点值得怀疑。

标签: java maven jboss


【解决方案1】:

根据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】:

    maven-dependency-plugin 的目标copy 做你想做的事,见example

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

    正如@Andreas_D 所说,对于 JBoss 部署目的,有一个更好的替代方案;类似地部署到其他应用服务器。

    【讨论】:

      【解决方案3】:

      最好的方法是使用一个可以实际部署您的应用程序的插件,例如cargojboss-maven plugin(感谢@Andreas_D)。

      这将是使用复制或通用上传工具的更好方法,因为部署是您实际尝试做的事情。

      使用 cargo 插件,您可以选择deploy to a variety of running servers。我们采用这种方法在构建期间使用jetty plugin 在码头进行本地测试,并通过 cargo 按需部署到 tomcat 的配置文件。

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

      【讨论】:

      • 我对这个答案投了反对票,因为它没有回答 OP 提出的具体问题,即如何复制工件。 OP 并没有要求替代方案。
      【解决方案4】:

      如果您想将文件复制到网络服务器(本地或远程),您可以使用 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>
      

      【讨论】:

      • 这相当于jboss-maven插件的hard-deploy目标
      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 2019-12-08
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多