我正在参与一个开源项目 ( ps3mediaserver ),该项目已从 google 代码 (SVN) 和 ANT (用于构建任务) 转移到 git (GitHub) 和 maven。我有自己的 fork(称为 pms-mlx),我想在其中维护一些插件,作为发布时默认打包的一部分。我对 Maven 很陌生,不太确定项目应该如何构建以尊重 Maven 方式。
我将首先描述环境以前的行为方式,然后给出关于迁移到 maven 的想法。
链接:
- 旧:谷歌代码上的 SVN + ANT ps3mediaserver 项目
- 旧:SourceForge 上的 SVN + ANT pms-mlx 项目
- 新:GitHub 上的 Git + Maven ps3mediaserver 项目
- 新:GitHub 上的 Git + Maven pms-mlx 项目
旧行为:
项目结构:
+--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 中的构建目标打包应用程序时,workspace/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/
职责:
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 以及所有插件都已构建并需要打包。package-pom 负责做到这一点。
在原始应用程序中只有一个pom.xml并且正在使用 Windows、Linux 和 OS X 的不同配置文件进行打包。我目前正在处理的一个是用于 OSX 并使用osxappbundle-maven-plugin,但是源代码永远不会打包在应用程序文件中。那是因为打包项目不再从实际项目继承。
如何引用构建的 jar 以便正确打包到应用程序文件中?
我尝试在附加资源中引用 jar 并作为自定义类路径,但从未成功。