具有单个公开工件和内部依赖项的 Maven 结构

Maven structure with a single exposed artifact and internal dependencies

我目前正在开发一个应用程序,并且我有一个结构如下的 Maven 项目:

|-> root
|
|-------> ui
|       |---> pom.xml
|
|-------> core
|       |---> pom.xml
|
|
|-------> pom.xml

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

问题:

您可以创建另一个模块 myapp,它将专门打包您的应用程序,包括 uicore。这个新模块将依赖于 uicore 模块,Maven 将自行处理构建顺序。然后,您可以将构建配置为仅部署/发布 myapp 模块。

尽管通常不推荐这样做,it is possible to configure certain modules of a multi-module Maven project to not be released by the maven-release-plugin. For that, you need to tell the 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 或当您使用发布插件执行发布时,只有配置为部署的模块才会真正部署或发布。在这种情况下,它只会是 myapp 模块:uicore 甚至父 POM,都不会被部署。

对于您的实际用例,myapp 可以创建一个 uber jar,但这个草图足以证明这是可能的。