包装多平台多模块maven项目

时间:2012-03-27 14:40:38

标签: maven packaging multi-module

我正在参与一个开源项目(ps3mediaserver),该项目已从谷歌代码(SVN)和ANT(用于构建任务)转移到git(GitHub)和maven。我有自己的fork(称为pms-mlx),我希望在释放时保持一些插件成为默认包装的一部分。我对maven很陌生,我不太确定如何构建项目以尊重maven的方式 我将从描述环境之前的行为开始,然后给出关于迁移到maven的想法。

链接:

旧行为:

项目结构:

    +--workspace
       +--plugins
          +--plugin1
             build.xml
          +--plugin2
             build.xml
       +--ps3mediaserver_mlx
          +--plugins
          build.xml

主项目是ps3mediaserver_mlx,所有插件都存在于workspace / plugins文件夹的子文件夹中。
ps3mediaserver_mlx / build.xml包含一个目标BuildWithoutLibs,它将构建主项目的jar并将其复制到workspace / pms_no_libs.jar,然后由插件引用(在此位置)。 执行任何插件的构建目标时,将构建插件并将生成的jar复制到ps3mediaserver_mlx / plugins / [plugin_name] .jar。
最后,当使用ps3mediaserver_mlx / build.xml中的构建目标打包应用程序时,工作空间/ ps3mediaserver_mlx / plugins中包含的插件将被打包(在Windows的exe安装程序中,对于OSX为dmg,对于linux为tar.gz)。 / p>

新行为 项目结构已更改为:

+-- workspace/
+-- pom.xml (global-pom)
+-- ps3mediaserver/
|    +-- pom.xml (pms-pom)
|    +-- src/
|         ...
+-- plugins/
|    +-- pom.xml (plugins-pom)
|    +-- Plugin1/
      |   pom.xml (plugin1-pom)
      |   src/
|    +-- Plugin2/
      |   pom.xml (plugin2-pom)
      |   src/
+-- pms-package/
     +-- pom.xml (package-pom)
     +-- src/main/assembly/
     +-- src/main/external-resources/

Responsabilities:
global-pom包含pms使用的所有依赖项的根pom。这允许使用相同的版本,而无需在任何插件中重新声明它们(这是一个好主意吗?)。构建所有内容并包含模块部分,以在所有项目上执行相同的maven命令

<modules>
  <module>ps3mediaserver</module>
  <module>plugins</module>
  <module>pms-package</module>
</modules>

pms-pom:继承自global-pom并构建pms jar

plugins-pom:继承自global-pom;包含pms的依赖项(所有插件都需要);包含所有必须构建的模块的列表

pluginX-pom:从plugins-pom继承并包含插件的自定义配置

package-pom:负责根据正在构建的平台打包pms。

此结构是否代表maven的使用方式?

一切都在努力打包。这意味着主应用程序jar以及所有插件都已构建并需要打包。包裹pom负责这样做。
在原始应用程序中,只有一个pom.xml,并且通过使用Windows,Linux和OS X的不同配置文件来完成打包。我目前正在处理的是OSX并使用osxappbundle-maven-plugin,但源代码永远不会打包在app文件中。那是因为包装项目不再继承实际项目了 为了在app文件中正确打包,如何引用构建的jar?
我尝试在additionalResources中引用jar并作为自定义类路径,但从未成功。

1 个答案:

答案 0 :(得分:1)

您已在插件/ pom.xml中定义了依赖项

<dependencies>
  <dependency>
    <groupId>net.pms</groupId>
    <artifactId>pms-mlx</artifactId>
    <version>1.52.1_mlx_v0.8-SNAPSHOT</version>
  </dependency>
</dependencies>

完全代表您的父母。换句话说,定义已经定义为父级的依赖项是错误的。

最好将modelVersion标记直接放在项目标记之后和父标记之前。在父标记之后,将当前模块的信息设置为artifactId。

在深入研究项目后,我注意到你在你的插件/ WebservicePlugin中定义了:

<modelVersion>4.0.0</modelVersion>
<artifactId>WebservicePlugin</artifactId>
<version>3-SNAPSHOT</version>
<packaging>jar</packaging>

<parent>
    <groupId>net.pms</groupId>
    <artifactId>pms-plugins</artifactId>
    <version>1.52.1_mlx_v0.8-SNAPSHOT</version>
</parent>

这违反了多模块构建的maven方式。在这种情况下,您不应该定义不同的版本。它应该是这样的:

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>net.pms</groupId>
    <artifactId>pms-plugins</artifactId>
    <version>1.52.1_mlx_v0.8-SNAPSHOT</version>
</parent>
<artifactId>WebservicePlugin</artifactId>

如果您遇到基于WebservicePlugin模块版本的问题,那么您应该考虑将WebservicePlugin与其他插件分开(也可能是其他插件)。

我注意到你在许多插件(如果不是全部)中定义了maven-compiler-plugin的配置和用法的另一件事...这应该通过使用pluginManagement部分来完成你的根本......简单地维护你的项目。

通过maven-antrun插件将创建的插件罐复制到另一个不同的位置。 不需要在每个插件中重复许可条目,因为它是由父级继承的。