首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打包多平台多模块maven项目

打包多平台多模块maven项目
EN

Stack Overflow用户
提问于 2012-03-27 14:40:37
回答 1查看 857关注 0票数 0

我正在参与一个开源项目(ps3mediaserver),该项目已经从google (SVN)和ANT (用于构建任务)转移到git (GitHub)和maven。我有自己的叉子(称为pms),在发布时,我想维护一些插件作为默认打包的一部分。我对maven非常陌生,也不太确定项目应该如何构建,以尊重maven的方式。

首先,我将描述以前环境是如何运行的,然后给出关于迁移到maven的想法。

链接:

旧行为:

项目结构:

代码语言:javascript
复制
    +--workspace
       +--plugins
          +--plugin1
             build.xml
          +--plugin2
             build.xml
       +--ps3mediaserver_mlx
          +--plugins
          build.xml

主要项目是ps3mediaserver_mlx,所有插件都位于工作区/插件文件夹的子文件夹中。

ps3mediaserver_mlx/build.xml包含一个目标BuildWithoutLibs,它将构建主项目的jar并将其复制到工作区/pms_no_libs.jar,然后由插件引用(在此位置)。

在执行任何插件的构建目标时,将生成插件并将其复制到ps3mediaserver_mlx/plugins/ plugin _name.jar中。

最后,当使用ps3mediaserver_mlx/build.xml中的构建目标打包应用程序时,包含在工作区/ps3mediaserver_mlx/ plugins中的插件将被打包( windows的exe安装程序、OSX的dmg或linux的tar.gz )。

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

代码语言:javascript
复制
+-- 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/

责任:

全球pom包含pms使用的所有依赖项的根pom。这样就可以使用相同的版本,而不必在任何插件中重新声明它们(这是个好主意吗?)生成所有内容,并包含模块部分,以在所有项目上执行相同的maven命令。

代码语言:javascript
复制
<modules>
  <module>ps3mediaserver</module>
  <module>plugins</module>
  <module>pms-package</module>
</modules>

pms-pom:从全局pom继承并构建pms jar

插件-pom:从全局-pom继承;包含pms的依赖关系(所有插件都需要它);包含必须构建的所有模块的列表。

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

包装-pom:负责根据正在构建的平台对pms进行打包。

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

所有的东西都在包装上。这意味着主应用程序jar以及所有插件都已经构建并需要打包。包裹-pom有责任这么做。

在最初的应用程序中,只有一个pom.xml,正在使用不同的配置文件为Windows完成打包。我目前正在处理的是OSX,使用osxappbundle-maven-plugin,但是源代码从来没有打包到应用程序文件中。这是因为打包项目不再继承实际的项目了。

如何引用构建的jar以便在应用程序文件中正确打包?

我尝试过在additionalResources中引用jar并将其作为自定义类路径引用,但从未成功。

EN

回答 1

Stack Overflow用户

发布于 2012-04-05 12:01:01

您已经定义了一个依赖项,例如在plugins/pu.xml中

代码语言:javascript
复制
<dependencies>
  <dependency>
    <groupId>net.pms</groupId>
    <artifactId>pms-mlx</artifactId>
    <version>1.52.1_mlx_v0.8-SNAPSHOT</version>
  </dependency>
</dependencies>

这正好代表了你的父母。换句话说,定义一个已经定义为父级的依赖项是错误的。

很好的做法是将modelVersion标记直接放在项目标记之后和父标记之前。在父标记放入信息之后,当前模块就像artifactId一样。

在深入该项目之后,我注意到您在您的插件/WebservicePlugin中定义了以下内容:

代码语言:javascript
复制
<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方法背道而驰。在这种情况下,您不应该定义不同的版本。它应该是这样的:

代码语言:javascript
复制
<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编译器插件的配置和使用……这应该通过在根pluginManagement中使用pom...to部分来完成,简化了项目的维护。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9891773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档