我正在参与一个开源项目(ps3mediaserver),该项目已经从google (SVN)和ANT (用于构建任务)转移到git (GitHub)和maven。我有自己的叉子(称为pms),在发布时,我想维护一些插件作为默认打包的一部分。我对maven非常陌生,也不太确定项目应该如何构建,以尊重maven的方式。
首先,我将描述以前环境是如何运行的,然后给出关于迁移到maven的想法。
链接:
旧行为:
项目结构:
+--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 )。
新行为项目结构已更改为:
+-- 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命令。
<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并将其作为自定义类路径引用,但从未成功。
发布于 2012-04-05 12:01:01
您已经定义了一个依赖项,例如在plugins/pu.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编译器插件的配置和使用……这应该通过在根pluginManagement中使用pom...to部分来完成,简化了项目的维护。
通过maven-antrun插件将创建的插件-jars复制到不同的位置,这是不同的。不需要在每个插件中重复许可证条目,因为它是由父程序继承的。
https://stackoverflow.com/questions/9891773
复制相似问题