使用不同/过滤类生成多个罐子的Maven最佳实践?

时间:2010-03-11 10:03:54

标签: maven-2 maven maven-assembly-plugin

我开发了一个Java实用程序库(类似于Apache Commons),我在各种项目中使用它。 除胖客户端外,我还将其用于移动客户端(具有J9 Foundation配置文件的PDA)。 随着时间的推移,作为单个项目启动的库分布在多个包中。因此,我最终获得了许多功能,这在所有项目中并不是真正需要的。

由于这个库也在一些移动/ PDA项目中使用,我需要一种方法来收集使用过的类并生成实际的专用jar。

目前在使用此库的项目中,我有Ant jar任务,从(从实用程序项目)生成专用jar文件(例如:my-util-1.0-pda.jar,my-util-1.0-rcp) .jar)使用include / exclude jar任务功能。由于生成的jar文件对移动项目的大小限制,这主要是需要的。

现在迁移到Maven我只是想知道是否有任何最佳实践可以达到类似的目的。我考虑以下场景:

[1] - 除了主要的jar工件( my-lib-1.0.jar )之外还会生成 my-lib 项目使用Maven Jar插件或Maven Assembly Plugin过滤/包含的分类器(例如: my-lib-1.0-pda.jar )的单独/专用工件。我对这种方法不太满意,因为它污染了图书馆消费者需求的库(过滤器)。

[2] - 为所有专门的客户/项目创建额外的Maven项目,这将“包装”“my-lib”并生成过滤的jar工件(例如: my -lib-wrapper-pda-1.0 ......等)。因此,这些包装器项目将包括过滤(生成过滤的工件),并且仅依赖于“my-lib”项目,客户端项目将依赖于 my-lib-wrapper-xxx-1.0 < / strong>而不是 my-lib-1.0 。这种方法可能看起来有问题,因为即使这样也会让“my-lib”项目完整(没有额外的分类器和工件),基本上会使项目数量增加一倍,因为对于每个客户端项目我都会有一个lib,只是为了收集所需的来自“my-util”库的类(“my-pda-app”项目需要一个“my-lib-wrapper-for-my-pda-app”项目/依赖项)。

[3] - 在每个使用该库的客户端项目中(例如: my-pda-app )添加一些专门的Maven插件进行修剪(生成时)最终工件/包)不需要的类(例如:maven-assembly-plugin,maven-jar-plugin,proguard-maven-plugin)。

以“Maven方式”解决此类问题的最佳做法是什么?

1 个答案:

答案 0 :(得分:24)

Maven通用规则是“每个POM的一个主要工件”,为了模块化,并且在How to Create Two JARs from One Project (...and why you shouldn’t)博客文章中很好地解释了不应该违反此约定的原因(一般情况下)。然而,有合理的例外(例如,生成EJB JAR的EJB项目和仅具有接口的客户端EJB JAR)。话虽如此:

上述blog post(同时检查Using Maven When You Can't Use the Conventions)说明了如何使用单独的配置文件或 JAR插件实施选项1 。如果您决定实施此解决方案,请记住,这应该是一个例外,并且它可能使依赖关系管理更加棘手(并且,正如您所提到的,使用“客户端过滤逻辑”污染项目)。为了以防万一,我会在这里使用几个JAR插件执行。

选项2 选项1 IMO没有什么不同(除了它分开的东西):基本上,有N个其他包装/过滤项目非常类似于N个过滤规则在一个项目中。如果过滤有意义,我更喜欢选项1。

我根本不喜欢选项3 ,因为我认为图书馆的客户不应该“清除”不需要的东西。首先,客户端项目不一定具有所需的知识(修剪内容),其次,这可能会对其他插件造成很大的混乱。

但是如果胖客户端使用整个 my-lib (就像服务器端代码需要整个EJB JAR一样) ,然后过滤不是处理你的情况的正确的“maven方式”。正确的方法是选项4 :将项目中的所有内容(生成 my-lib-core-1.0.jar )和特定项目中的特定部分(将生成 my-lib-pda-1.0.jar 等)。然后,客户端将依赖于核心工件和专用工具。