开发者

Use Maven just to fetch some library jars

We are using ANT for our build process and don't have plans to change this in the near f开发者_开发问答uture.

Is it possible to use Maven to just fetch common Open Source jar files (e.g. Log4J, SWT, JFace) and put them in the right location of our project, so we don't have to store them in our version control — preferable without creating the typical Maven-cache in the home directory?


NO NO NO Everyone!

If you're using Ant, the best way to use Maven repositories to download jar dependencies is to use Ivy with Ant. That's exactly what Ivy is for.

Installing Ivy and getting to work with current Ant projects is simple to do. It works with Nexus and Artifactory if you use those as your local Maven repositories.

Take a look at Ivy. It is probably exactly what you want.


In variation of org.life.java's answer, I would not do mvn install.

Instead, in the pom.xml I would add the following bit:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Now you just need to do mvn generate-sources, which is a lot faster than the full mvn install, and all dependencies will be copied to the specified directory.


Oh btw, isn't that what Apache Ivy is about? Extending Ant to understand Maven's dependency management?


It's possible, you should use maven-ant-tasks.

In particular its dependencies ant task. With this setup no Maven install is required.

<?xml version="1.0" encoding="UTF-8"?>
<project
  name="download-dependency"
  basedir="."
  default="download-dependency"
  xmlns:artifact="antlib:org.apache.maven.artifact.ant"
>
  <target name="download-dependency">

    ... define properties ...

    <taskdef
      resource="org/apache/maven/artifact/ant/antlib.xml"
      uri="antlib:org.apache.maven.artifact.ant"
    />

    <artifact:dependencies>
      <localRepository path="${local-repo.dir}"/>
      <remoteRepository id="central" url="${repository-uri}"/>
      <dependency
        groupId="${groupId}"
        artifactId="${artifactId}"
        version="${version}"
        type="${type}"
        classifier="${classifier}"
        scope="runtime"
      />
    </artifact:dependencies>
  </target>
</project>

The only binary you should check into your project is maven-ant-tasks.jar.

Actually in our project I used Sonatype Nexus ( documentation ) Maven repository manager to centralize access to different repositories and even maintain some binaries unique to our environment. With Nexus' help I just fetch maven-ant-tasks.jar with ant's <get> task from a known URL. You don't have to use Nexus, but it greatly speeds up builds, because it caches binaries close to your developer's machines.


Ivy does just this, when it bootstraps itself:
http://ant.apache.org/ivy/history/latest-milestone/samples/build.xml

<property name="ivy.install.version" value="2.0.0-beta1"/>
<property name="ivy.jar.dir" value="lib"/>
<property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar"/>
<target name="resolve" unless="skip.download">
    <mkdir dir="${ivy.jar.dir}"/>
    <echo message="installing ivy..."/>
    <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar" dest="${ivy.jar.file}" usetimestamp="true"/>
</target> 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜