Mr.Eddart
Mr.Eddart

Reputation: 10273

Maven: how to copy artifact to specific directory?

The "install" goal copies the artifact to the target directory and to the local repository.

How can I tell Maven to copy it also to a given directory (like the deploy directory of JBoss for example).

Upvotes: 26

Views: 48745

Answers (4)

Jörg
Jörg

Reputation: 2461

According to http://maven.apache.org/plugins/maven-dependency-plugin/examples/copying-artifacts.html you can copy the just built artifact to a specific directory:

<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>

Upvotes: 15

Petr Kozelka
Petr Kozelka

Reputation: 7990

The goal copy of maven-dependency-plugin does what you want, see the example.

It is however not a good idea to copy anything outside your target directory (or ${project.build.directory} to be precise) - especially if such action is attached to a build phase, because it introduces unexpected side-effects of the build, and sometimes even loss of reproducibility.

As @Andreas_D notes, there is a better alternative for JBoss deployment purpose; similarly for deploying to other appservers.

Upvotes: 19

Robin
Robin

Reputation: 24262

The best approach would be to use a plugin which will actually deploy your application, such as cargo or jboss-maven plugin (credit to @Andreas_D for that one).

This would be a better approach to using a copy or generic upload tool since deploying is what you are actually trying to do.

With the cargo plugin you have the option to deploy to a variety of running servers. We took this approach to test locally in jetty using the jetty plugin during the build and had a profile to deploy to tomcat on demand via cargo.

Note: If you have your target server (JBOSS) installed locally on the dev box as well then you can also use cargo to start/stop your server during your build process as well. The downside of this approach is that you will need it to reference it's location in the pom file, so either all devs install it in the same location or a system property that defines where it is located (similar to JAVA_HOME).

Upvotes: 3

Tristan
Tristan

Reputation: 9121

If you want to copy file to a webserver (local or distant) you can use Maven upload plugin :

                <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>

And to configure parameters in a smart way, I use maven profiles :

<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>

I've created an "ant launcher", to use it by clicking under Eclipse ant view :

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

But you can simply run it on a command line :

mvn upload:upload -Pdeveloppement

By the way, for distant deployment, you may need a login password for scp to work. You have to add them to you Maven settings.xml file :

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

Upvotes: 9

Related Questions