具有单个暴露工件和内部依赖关系的Maven结构

时间:2016-09-12 17:21:12

标签: maven dependency-management maven-release-plugin

我正在构建一个应用程序,我有一个像这样结构的maven项目:

|-> root
|
|-------> ui
|       |---> pom.xml
|
|-------> core
|       |---> pom.xml
|
|
|-------> pom.xml
  • ui 取决于核心
  • 核心没有内部依赖
  • root/pom.xml是一个聚合器,用于指定模块uicore

现在我打算mvn release这个软件,我只想公开一个中央工件myapp,它应该是一个包含来自ui和{core的所有代码的jar {1}}(即我不希望ui,core和聚合器都单独发布),以便任何将myapp添加为依赖项的人都可以访问com.somepackage.ui以及{ {1}}。

问题:

  • 如何处理com.somepackage.core依赖项?我可以指向相对pom ui -> core吗?
  • 如何将生成的来源从../core/pom.xmlui捆绑到core
  • ${rootartifactname}.jar上运行mvn deploy会将所有三个poms部署到存储库,所以现在任何人都可以引用我的root工件而我不想要它,我该如何仅公开root pom artifact

1 个答案:

答案 0 :(得分:1)

您可以创建另一个模块myapp,该模块将专门打包您的应用,包括uicore。这个新模块将依赖于uicore模块,Maven将负责构建顺序本身。然后,您可以将构建配置为仅部署/释放myapp模块。

虽然通常不建议使用it is possible来配置多模块Maven项目的某些模块不被maven-release-plugin发布。为此,您需要告诉maven-deploy-plugin跳过其默认执行。

myapp模块的简单实现如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>my.groupId</groupId>
    <artifactId>root</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>myapp</artifactId>
  <dependencies>
    <dependency>
      <groupId>my.groupId</groupId>
      <artifactId>ui</artifactId> <!-- brings core transitively -->
      <version>${project.version}</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <configuration>
          <skip>false</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

然后,在名为root的父模块中,您将拥有默认

<plugin>
  <artifactId>maven-deploy-plugin</artifactId>
  <version>2.8.2</version>
  <configuration>
    <skip>true</skip>
  </configuration>
</plugin>

当您运行mvn clean deploy或使用Release Plugin执行发布时,实际上只会部署或释放配置为部署的模块。在这种情况下,它只会是myapp模块:uicore甚至父POM都不会被部署。

对于你的真实用例,myapp可以创建一个超级jar,但这个草图足以表明它是可能的。