maven使用简单的命令行安装和部署第三方依赖项

时间:2011-01-08 06:06:50

标签: java maven-2 maven-3

我们有许多不在任何地方托管的第三方依赖项。对于其中的每一个,我们都有一个jar文件,我们希望能够安装和/或部署到我们的存储库。一些jar文件有自己的依赖项,我们还需要声明这些。

我们为每个声明groupId,artifactId,依赖关系等的jar文件制作了pom.xml文件。这些pom.xml文件都有一个共同的父pom,用于声明一些常见信息(例如{{1} }和<repositories>)。

我希望能够使用<distributionManagement>mvn install(或者mvn deploymvn install:install-file)之类的简单内容来安装或部署这些依赖项。从pom.xml文件中读取这些命令(mvn deploy:deploy-fileartifactId等)的必要属性。

为了实现这一点,至少在部署时,我尝试将以下内容放入我的父pom中:

repositoryId

然后让每个子poms定义<build> <plugins> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.4</version> <configuration> <file>${jarfile}</file> <pomFile>pom.xml</pomFile> <repositoryId>our-id</repositoryId> <url>our-url</url> </configuration> </plugin> </plugins> </build> 属性。这允许我运行jarfile来部署所有子pom工件。据推测,我可以做类似的事情让mvn deploy:deploy-file起作用。

但是使用这种方法,我无法释放父pom(我必须这样做,因为孩子poms依赖它),如果我尝试在父pom上mvn install:install-file,我会得到像:

mvn release:perform

我觉得我可能会以错误的方式解决这个问题。我真正想做的就是:

  • 将所有第三方广告的公共代码放在一个共享父pom中
  • 为每个第三方jar写一个额外的小pom
  • 能够运行Cannot override read-only parameter: pomFile mvn install之类的内容,而无需指定所有复杂的命令行属性

我怎样才能最好地实现这一目标?

修改:更清楚地说明了我希望能够运行像mvn deploymvn install这样简单的事情,而不必在命令行。

3 个答案:

答案 0 :(得分:2)

当Maven缺少一个依赖项时,它会在输出中给出一个错误,其中包含要将jar添加到远程存储库的命令行。该命令行将自动为您创建一个POM并将两者一起上传。这不足以满足您的需求吗?

使用这个工具,如果我知道我有一个没有远程存储库表示的依赖项,我通常只需继续使用我想要的GAV在我的构建中定义它,运行一次构建,然后查看构建错误。复制出部署命令,然后运行该命令。您需要确保在父POM中正确设置了<repository>元素,并在<server>中使用存储库上载密码设置了相应的settings.xml元素。除此之外,你应该好好去。

我想补充一点,你应该在到达远方之前查看Nexus。现在建立起来是值得的麻烦! : - )

答案 1 :(得分:2)

好的,我找到了一个解决方案,允许我只运行mvn installmvn deploy并将jar文件安装到本地或远程存储库。灵感来自a post to the maven-users list并使用build-helper plugin,在父pom中,我有:

<pluginManagement>
    <plugins>
        <!-- Attach the jar file to the artifact -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.5</version>
            <executions>
                <execution>
                    <id>attach-artifacts</id>
                    <phase>package</phase>
                    <goals>
                        <goal>attach-artifact</goal>
                    </goals>
                    <configuration>
                        <artifacts>
                            <artifact>
                                <file>${artifactId}-${version}.jar</file>
                                <type>jar</type>
                            </artifact>
                        </artifacts>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</pluginManagement>

然后在孩子们的poms中,我有:

<packaging>pom</packaging>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

其中一些最初使我绊倒的部分:

  • attach-artifact执行应该在<pluginManagement>下,因此,如果您{p父} mvn installmvn deploy,则不会执行此任务。
  • 孩子们需要在构建插件下指定build-helper-maven-plugin,以便来自父<pluginManagement>的代码运行。
  • 必须将子项声明为<packaging>pom</packaging>,因为如果它与工件具有相同的名称,则无法将jar添加到工件中。

我看到这种方法的唯一缺点是工件被部署为pom类型而不是类型jar。但我没有看到任何真正的后果。

答案 2 :(得分:0)

我在工作中遇到了这个问题:

  

现在我有一个target.jar(它有一个依赖列表:a.jar,b.jar,c.jar ......),我想用mvn install:install-file将它放入我的本地仓库,但是当我运行命令打击

mvn install:install-file -Dfile=/Users/username/.../target.jar -DgroupId=com.cnetwork.relevance  -DartifactId=target  -Dversion=1.0.0

但是当我使用它时,我发现有很多错误,使用target.jar的jar找不到a.jarb.jarc.jar,例如:

com.cnetwork.a does not exist
com.cnetwork.b does not exist
com.cnetwork.c does not exist

然后我去~/.m2/repository/.../target/1.0.0/target.pom找到了目标的pom文件,但没有任何内容!

...
<groupId>com.cnetwork.relevance</groupId>
<artifactId>target</artifactId>
<version>1.0.0</version>
....
# no dependencies about a/b/c.jar !!!

这是出错的地方,install:file -Dfile -DgroupId -D..不会将依赖项添加到pom中,我通过此方法更正了答案

  1. 如果您已经have this maven project source,只需将其安装到本地仓库

    即可

    mvn clean install

  2. 如果您have the jar and the pom of it,请安装带有pom的jar

    mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom

  3. 如果你don't have a pom with target jar,请写一个并使用上面的命令。

  4. 如果你无法恢复它的pom文件,可能你应该放弃。