4

我知道这违反了 maven 最佳实践,但也许我的情况是规则中为数不多的例外之一——至少我一直在思考替代方案:(

环境是这样的:

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

首先,我尝试将所有这些都放在一个“简单”的项目中,该项目一直到应该安装工件的地步。

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

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

这种方法有一个缺点,我从“Java”和“SWC”引用了“GenerateSource”的内部结构,这很丑但可以容忍。
真正阻碍我的是,我必须对安装和部署插件进行大量调整,以获取带有触发整个过程的遗留界面的名称和版本的工件。我现在让它运行,但它看起来很脆弱。

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

  • GenerateSources & Java
  • 生成源和 SWC

但这只会解决交叉引用的小麻烦。

正如 Aaron 在他的评论中指出的那样,我不清楚说明这个问题。经过更多的实验,这对我来说更清楚了:基本上我有两个问题要解决

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

有什么建议可以让整个过程更像 Maven 吗?

提前致谢。

4

3 回答 3

3

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

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

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

    2.2 运行maven构建

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

于 2011-04-18T10:40:58.123 回答
2

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

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

至于安装/部署:这些插件的名称来自创建工件的插件。所以你设置属性的方式一定有问题。在您的情况下,这就是JAR 插件。该文档有一个示例如何设置默认工件的名称

于 2011-04-15T07:51:02.177 回答
1

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

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

于 2011-04-15T10:36:57.527 回答