如何从一个源生成多个Maven工件

时间:2011-04-14 09:10:07

标签: maven artifacts

我知道这是针对maven的最佳做法,但也许我的情况是该规则中为数不多的例外情况之一 - 至少我不得不考虑其他选择:(

环境就是这样:

  • 我们有一个基于专有技术的外部接口的遗留应用程序
  • 我们想使用flash作为新的前端
  • 基于遗留接口,我们生成flash类并将它们打包在flash swc中以供前端开发人员使用
  • 基于遗留接口,我们生成java类,将闪存服务请求(通过blazeds)连接到我们的旧接口
  • 使其变得更加困难,我们不希望/不能在每个接口上使用pom,因为我们有几十个(接口),并且它们只会在artifactId中有所不同。相反,我使用“通用”项目结构,将为每个构建进行参数化(由jenkins)。该项目在完全自动化的环境中使用。

首先,我尝试将所有这些放在一个“简单”的项目中,这个项目可以安装工件。

我目前的方法是一个多模块项目结构,受maven参考第13章的启发,它有一些缺点:

GenericProject
|
+-- GenerateSources from legacy interface
|   +-- pom.xml
|
+-- Java 
|   +-- pom.xml
|
+-- SWC 
|   +-- pom.xml
|
+-- pom.xml

这种方法有缺点,我从“Java”& “SWC”到“GenerateSource”的内部结构,这是丑陋但可以容忍的 真正阻碍我的方式是我必须大力调整安装和安装。部署插件以获取名称为&的工件。触发整个过程的旧版界面版本。 我现在跑了,但看起来很脆弱。

我考虑过在两个简单的项目中拆分/复制项目:

  • GenerateSources&爪哇
  • GenerateSources& SWC

但这只会解决交叉引用的轻微烦恼。

正如亚伦在评论中指出的那样,我不清楚这个问题。 经过一些实验,这对我来说更加清晰: 基本上我有两个问题需要解决

  1. 一起安装/部署两个工件
  2. 将工件命名为与project.artifactId
  3. 不同的工件

    有什么建议让整个过程更像maven吗?

    提前致谢。

3 个答案:

答案 0 :(得分:3)

经过多模块方法的一些弯路后,我得出了以下实用的解决方案:

  1. 使用build-helper-plugin附加要自动安装/部署的辅助工件
  2. 两阶段构建:

    2.1通过sed生成一个pom.xml,其中包含已解析的project.artifactId& project.version

    2.2运行maven build

  3. 虽然理论上你可以将表达式用作project.artifactId& project.version,maven会给你一个警告。 。 。有充分理由: 当您尝试引用生成的工件时,nexus将为您提供“无法读取...的工件描述符”。错误。 我怀疑这是因为在存储库中存储的pom中,表达式尚未解析!

答案 1 :(得分:2)

您应该编写一个附加到generate-sources阶段的小型Maven插件。有关示例(maven-annotation-plugin),请参阅main class

这将包括GenerateSource输出中生成的源,您可以通过在其他POM中包含依赖项来使用这些类。请注意,您应该在target/下创建这些文件,而不是src/

至于安装/部署:这些插件从创建工件的插件中获取其名称。因此,如何设置属性肯定存在问题。在你的情况下,那是JAR plugin。该文档有一个如何set the name of the default artifact的示例。

答案 2 :(得分:1)

尝试使用Maven叠加层,它用于在多个Web应用程序之间共享资源。

http://maven.apache.org/plugins/maven-war-plugin/overlays.html