将同一个包中的类构建到单独的jar中

时间:2012-01-30 15:07:27

标签: java build

我有一个服务器应用程序和两个基于Swing的客户端应用程序。我们正在eclipse中开发它们,每个项目都有一个单独的项目。

许多课程都是共享的。例如,my.server包具有服务器和客户端的一些类,而其他包仅用于服务器。虽然我更喜欢将它们放在同一个包中,因为它们密切相关,而且其中一些依赖于包的可见性,我不想分发应用程序不需要的类,因为它不仅会使文件大小变大,而且还会这将是一个安全风险。

目前,每个服务器和客户端都有相同的jar,这是一团糟。理想情况下,我想根据依赖关系自动创建jar。

服务器:

  • server.jar:仅限服务器使用的类
  • server-client1-common.jar:服务器和客户端1共享的类
  • server-client2-common.jar:服务器和客户端2共享的类

客户1:

  • client1.jar:仅限客户端1使用的类
  • server-client1-common.jar:服务器和客户端1共享的类
  • client-common.jar:客户端1和客户端2共享的类,但不是服务器

客户2:

  • client2.jar:仅限客户端2使用的类
  • server-client2-common.jar:服务器和客户端2共享的类
  • client-common.jar:客户端1和客户端2共享的类,但不是服务器

我意识到您可以使用ant手动执行此操作,但这将是一次维护灾难。是否有一个工具可以自动处理这种依赖?

4 个答案:

答案 0 :(得分:3)

“维护灾难”是什么意思?如果您创建一个ANT脚本,只需运行它,它就会为您编译和打包罐子。

作为一种更强大的替代方案,您可以使用maven。对于更轻量级的东西,内置的eclipse导出工具可能会起作用。

答案 1 :(得分:3)

我无法向您提供随时可用的解决方案。这里有一个想法:创建一个注释或一组注释,如下所示:

@jarselector(types='server')
class ServerOnly {
   ...
}

@jarselector(types='server,client1')
class ServerAndClient {
   ...
}

然后通过扩展jar任务(或maven插件)或编写自己的任务创建自己的ant任务,该任务根据注释获取此注释并打包类,然后将其用作过滤器。

你只需要创建一次任务 - 我过去已经完成了它,它没有听起来那么复杂,问题听起来足够大,值得努力。

之后,您必须对所有类进行一次注释(或者仅根据您的实现仅对客户端需要的类进行注释,或者仅对每个jar不共享的类进行注释)。看到课程的人可以立即看到它的用途。创建新类时,您可以轻松添加注释。

我真的不认为有一个现成的ant任务或maven插件可以做到这一点。

或者 - 如果您真的无法更改包结构 - 您还可以使用多个源目录来保存包,但将文件拆分到不同的目录中。 Eclipse不关心您使用多少源目录。然后,您需要为源目录调整一次构建工具,然后可以对文件进行排序。

答案 2 :(得分:1)

为您要创建的每个JAR都有一个单独的Eclipse项目。然后在每个顶级项目的Build Path的“Projects”选项卡上设置依赖项。因此,“服务器”项目将“server-client1-common”和“server-client2-common”列为必需项目。等等。

我见过这个模型被许多不同的组织使用,我一直认为这是“行业接受”的方式。它只是有效!

答案 3 :(得分:1)

有关构建应用程序的最佳实践之一是每个项目都有一个jar。 例如,Maven使用它作为默认值。你可以欺骗它做其他事情,但最好加入他们而不是“打”他们。

http://maven.apache.org/guides/mini/guide-using-one-source-directory.html
http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

因此,在您的情况下,您应该创建6个项目: Server,Client1,Client2,ServerClient1Common,ServerClient2Common,ClientCommon

为了选择所需的类,我认为没有工具,可能你应该更清楚地知道什么是常用功能。 创建Common项目,并将它们添加到构建路径 - 依赖项。然后开始将类移动到Common项目中,将它们放在同一个包中。

例如,创建ServerClient1Common项目 对于Client1,请转到配置构建路径 - >项目。添加ServerClient1Common。删除对Server Project的所有引用 对于Server,请转到配置构建路径 - >项目。添加ServerClient1Common。删除对Client1项目的所有引用。

您现在应该有很多缺少的类/导入。尝试逐一解决它们。

最后,你应该能够编译3个项目并获得你提到的罐子。

PS:其他策略(比如一个具有不同构建目标的超级项目,或者与缠绕的ant / maven构建器相关的3个项目)更加混乱。可能有一个例外 - 另一种分割类的方法,但我不知道它是否适用于你:client1.jar,client1-interface.jar,client2.jar,client2-interface.jar,server.jar,server- interface.jar。这样你就可以使用3个项目,每个项目都有两个目标罐子。要运行client2.jar,您需要server-interface.jar