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

use*_*682 32 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插件使用分类器(例如:my-lib-1.0-pda.jar)生成单独/专用工件或Maven Assembly Plugin过滤/包含.我对这种方法不太满意,因为它污染了库,消费者需要(过滤器).

[2] - 为所有专门的客户端/项目创建额外的Maven项目,这将"包装""my-lib"并生成过滤的jar工件(例如:my-lib-wrapper-pda-1.0 ......等) .因此,这些包装器项目将包括过滤(以生成过滤的工件),并将仅依赖于"my-lib"项目,客户端项目将依赖于my-lib-wrapper-xxx-1.0而不是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方式"中解决此类问题的最佳实践是什么?

Pas*_*ent 24

为了模块化,Maven通用规则是"每个POM的一个主要工件",并且在如何从一个项目中创建两个JAR(&...)中非常好地解释了不应该违反此约定的原因(通常)为什么你不应该)博客文章.然而,有合理的例外(例如,生成EJB JAR的EJB项目和仅具有接口的客户端EJB JAR).话说回来:

上面提到的博客文章(当你不能使用约定时也检查使用Maven)解释了如何使用单独的配置文件或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等)放在一起.然后,客户端将依赖于核心工件和专用工件.