将JAR文件打包成WAR文件

3
我有一系列依赖Java项目。我想将它们打包成一个单独的JAR文件,以便在我的WAR文件中使用。这些项目依赖于大量的外部库和项目,如log4j、apache-commons等。
我在Eclipse中选择所有项目并导出为JAR文件,然后将JAR文件复制到我的WAR的/WEB-INF/lib文件夹中,然后部署应用程序。我遇到了以下问题:
  1. ClassNotFoundException。Web应用程序找不到打包在我的JAR文件中的库。我通过将所有依赖库移到/WEB-INF/lib文件夹中,并将类路径条目添加到JAR的MANIFEST.MF中来解决了这个问题,这是一个非常痛苦的过程。
  2. JAR文件中的类无法找到打包在其中的属性文件。我该如何解决这个问题?
是否有这些问题的标准解决方案?谢谢。

1
你为什么想要将所有依赖项放在一个单独的jar包中?把它们全部放到WEB-INF/lib中有什么问题吗?(另外:你不需要任何Class-Path条目,Web应用程序自动可以访问WEB-INF/lib中的所有jar文件)。 - Joachim Sauer
我更喜欢保持我的JAR文件自包含和可分发性,而不是在我的WEB-INF/lib中爆炸不必要的依赖项。 - Justin Wong
1
它们不是不必要的,对吧?如果你想要一个自包含的jar文件,那就不要使用外部库。 - Joachim Sauer
3
只有一个词:maven。但是你似乎在面对错误的问题。一个独立的Web应用程序简单地由WAR文件表示,而不是JAR文件。将你的依赖关系放入WEB-INF/lib中并不能使它更具分发性。 - biziclop
如果 jar 文件 A 尝试访问 jar 文件 B 中的类,并且 A 和 B 都在 war 中,我就会遇到相同的问题! - k.honsali
3个回答

4
我建议您使用自动进行依赖管理的工具。如果您已经有了用于构建脚本的ant,则ivy是一个不错的解决方案。如果您没有构建脚本,那么可能值得考虑maven。
依赖管理会自动为您拉取直接使用的依赖项(jar)所需的传递依赖项。

1

我在部署时遇到了同样的问题。为了解决这个问题,我只需更改项目的属性:

  • 右键单击项目
  • 选择“属性”-->“部署程序集”-->“添加”-->“Java构建路径条目”
  • 选择您想要添加到Web应用程序中的所有库

如果操作正确,这将自动将外部.jar库添加到您的.war文件中。


0

这个问题的标准解决方案是将所有依赖的jar文件放在WEB-INF/lib文件夹中。而你正在寻找的是一种非标准解决方案。

其中有很多种方法。修改清单文件中的类路径是其中之一。你也可以将它们放在容器共享库目录中,或者将它们放在任何地方并将它们添加到容器进程的全局类路径中。所有这些方法都可以工作,但都不被认为是最佳实践。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接