我正在参与一个开源项目(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并作为自定义类路径,但从未成功。
答案 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插件将创建的插件罐复制到另一个不同的位置。 不需要在每个插件中重复许可条目,因为它是由父级继承的。