0

我正在参与一个开源项目 ( ps3mediaserver ),该项目已从 google 代码 (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 中的构建目标打包应用程序时,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 并作为自定义类路径,但从未成功。

4

1 回答 1

1

例如,您在 plugins/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 的配置和使用...这应该通过在根 pom 中使用 pluginManagement 部分来完成...简化项目的维护。

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

于 2012-04-05T12:01:01.243 回答