我们有许多不在任何地方托管的第三方依赖项。对于其中的每一个,我们都有一个jar文件,我们希望能够安装和/或部署到我们的存储库。一些jar文件有自己的依赖项,我们还需要声明这些。
我们为每个声明groupId,artifactId,依赖关系等的jar文件制作了pom.xml文件。这些pom.xml文件都有一个共同的父pom,用于声明一些常见信息(例如{{1} }和<repositories>
)。
我希望能够使用<distributionManagement>
和mvn install
(或者mvn deploy
和mvn install:install-file
)之类的简单内容来安装或部署这些依赖项。从pom.xml文件中读取这些命令(mvn deploy:deploy-file
,artifactId
等)的必要属性。
为了实现这一点,至少在部署时,我尝试将以下内容放入我的父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
我觉得我可能会以错误的方式解决这个问题。我真正想做的就是:
Cannot override read-only parameter: pomFile
或mvn install
之类的内容,而无需指定所有复杂的命令行属性我怎样才能最好地实现这一目标?
修改:更清楚地说明了我希望能够运行像mvn deploy
或mvn install
这样简单的事情,而不必在命令行。
答案 0 :(得分:2)
当Maven缺少一个依赖项时,它会在输出中给出一个错误,其中包含要将jar添加到远程存储库的命令行。该命令行将自动为您创建一个POM并将两者一起上传。这不足以满足您的需求吗?
使用这个工具,如果我知道我有一个没有远程存储库表示的依赖项,我通常只需继续使用我想要的GAV在我的构建中定义它,运行一次构建,然后查看构建错误。复制出部署命令,然后运行该命令。您需要确保在父POM中正确设置了<repository>
元素,并在<server>
中使用存储库上载密码设置了相应的settings.xml
元素。除此之外,你应该好好去。
我想补充一点,你应该在到达远方之前查看Nexus。现在建立起来是值得的麻烦! : - )
答案 1 :(得分:2)
好的,我找到了一个解决方案,允许我只运行mvn install
或mvn 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 install
或mvn 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.jar
,b.jar
,c.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中,我通过此方法更正了答案
如果您已经have this maven project source
,只需将其安装到本地仓库
mvn clean install
如果您have the jar and the pom of it
,请安装带有pom的jar
mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom
如果你don't have a pom with target jar
,请写一个并使用上面的命令。
如果你无法恢复它的pom文件,可能你应该放弃。