2016-09-12 26 views
1

我目前正在建立一个应用程序,我有一个Maven项目结构如下所示:Maven的结构具有单一暴露神器和内部依赖

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

现在我打算mvn release这个软件,我只是想揭露中央神器说myapp这应该是一个包含所有代码uicore(即一个罐子。我不希望ui,核心和聚合器都单独发布),因此任何将myapp作为依赖关系的人都可以访问com.somepackage.ui以及com.somepackage.core

问题:

  • 如何处理ui -> core依赖?我可以让它指向一个相对pom ../core/pom.xml
  • 我如何从捆绑和uicore产生源为${rootartifactname}.jar
  • 运行mvn deployroot部署所有三个劲歌到存储库中,所以现在任何人都可以参考我的ui神器,我不希望出现这种情况,如何我仅露出根POM神器
+0

我认为这不是微不足道的。实现所有目标的最简单方法是只有一个Maven项目,并依靠软件包进行结构化。 – mm759

+0

“我如何处理ui - >核心依赖关系?我可以将它指向相对pom ../ core/pom.xml吗?”您可以使用常规依赖项。 – mm759

+0

“如何将生成的来自uiand核心的源代码捆绑到$ {rootartifactname} .jar中”maven-assembly-plugin可以将Jars捆绑到Zip文件中。这可能是一种替代选择。还有一个用于创建安装程序的izpack插件。 – mm759

回答

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,当您运行mvn clean deploy你将有一个默认的

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

或当您使用Release Plugin执行发行版时,只有配置为部署的模块才会实际部署或发布。在这种情况下,它只会是myapp模块:ui,core甚至是父POM,都不会被部署。

对于您的真实使用案例,myapp可能会创建一个超级罐子,但是此示意图足以表明它是可能的。

+0

感谢您的帖子。我试图完成你所描述的任务,并将'myapp' jar部署到版本库,但用户不能使用,因为它引用了父版本,而且父版本没有上传。那么可能的父母将无法使用,因为'ui'和'core'也不会存在。任何方式在这个? –

+0

@ᴘᴀɴᴀʏɪᴏᴛɪs嗯,我以为你只想部署'myapp',这样用户就可以下载。你需要父母,如果你要依赖它,是的,在这种情况下,你可以跳过'ui'和'core'的部署,而不是父母。它不应该导致没有被部署的两个模块的麻烦。 – Tunaki

+0

是的,我只想部署'myapp',并在你的样本上添加了一个''标签,我认为它是需要的,我将它删除并重新发布了'myapp',一切都很好,再次感谢! –