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

Ste*_*eve 6 java maven-2 maven-3

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

我们为每个声明groupId,artifactId,依赖项等的jar文件制作了pom.xml文件.这些pom.xml文件都有一个共同的父pom,它声明了一些常见的信息(例如<repositories><distributionManagement>).

我想能够安装或部署这些依赖与作为简单的东西mvn installmvn deploy(或者mvn install:install-filemvn deploy:deploy-file),并拥有所有这些命令的必要的属性(artifactId,repositoryId,等)从pom.xml的文件中读取.

为了使这个工作,至少为了部署,我尝试将以下内容放在我的父pom中:

<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>
Run Code Online (Sandbox Code Playgroud)

然后让每个子poms定义jarfile属性.这允许我运行mvn deploy:deploy-file以部署所有子pom工件.据推测,我可以做类似的事情mvn install:install-file去上班.

但是使用这种方法,我无法释放父pom(我必须这么做,因为孩子poms依赖它),如果我尝试mvn release:perform使用父pom,我会得到如下错误:

Cannot override read-only parameter: pomFile
Run Code Online (Sandbox Code Playgroud)

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

  • 将所有第三方jar的公共代码放在一个共享父pom中
  • 为每个第三方jar写一个额外的最小pom
  • 能够运行类似于mvn installmvn deploy不必指定所有那些复杂的命令行属性的东西

我怎样才能做到最好?

编辑:制造这上面清晰的理想,我想能够运行一样简单的东西mvn install或者mvn deploy和没有指定命令行上的属性.

Ste*_*eve 2

好的,我找到了一个解决方案,允许我运行mvn installmvn deploy将 jar 文件安装到本地或远程存储库。受到maven-users 列表的帖子的启发并使用build-helper 插件,在父 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>
Run Code Online (Sandbox Code Playgroud)

然后在子 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>
Run Code Online (Sandbox Code Playgroud)

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

  • 执行attach-artifact应该在下面,这样如果您或父 pom.xml<pluginManagement>没有被执行,它就不会被执行。mvn installmvn deploy
  • 子级需要build-helper-maven-plugin在构建插件下指定,以便<pluginManagement>运行父级的代码。
  • 必须将子项声明为具有,<packaging>pom</packaging>因为如果 jar 与工件同名,则无法将其添加到工件中。

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