Java 在WAR文件中打包JAR文件

Java 在WAR文件中打包JAR文件,java,jar,war,Java,Jar,War,我有一系列相关的Java项目。我想把它们打包成一个JAR文件,用在我的WAR文件中。这些项目依赖于大量的外部库和项目,如log4j、apachecommons等 我选择Eclipse中的所有项目并导出为JAR文件,然后将JAR文件复制到WAR的/WEB-INF/lib文件夹中,然后部署我的应用程序。我有以下问题: ClassNotFoundException。web应用程序找不到打包到我的JAR文件中的库。我通过将所有依赖库移出/WEB-INF/lib文件夹并将类路径条目添加到JAR的MANIF

我有一系列相关的Java项目。我想把它们打包成一个JAR文件,用在我的WAR文件中。这些项目依赖于大量的外部库和项目,如log4j、apachecommons等

我选择Eclipse中的所有项目并导出为JAR文件,然后将JAR文件复制到WAR的/WEB-INF/lib文件夹中,然后部署我的应用程序。我有以下问题:

  • ClassNotFoundException。web应用程序找不到打包到我的JAR文件中的库。我通过将所有依赖库移出/WEB-INF/lib文件夹并将类路径条目添加到JAR的MANIFEST.MF中解决了这个问题,这是一个非常痛苦的过程

  • JAR文件中的类找不到打包在JAR中的属性文件。我如何解决这个问题


  • 这些问题有标准的解决方案吗?谢谢。

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


    其中有很多。修改清单文件中的类路径是其中之一。您还可以将它们放在容器共享库目录中,或者放在任何位置,并将它们添加到容器进程的全局类路径中。所有这些都可以,但没有一个被认为是最佳实践。

    我建议您使用自动依赖关系管理功能。如果您已经为构建脚本准备了ant,那么ivy是一个很好的解决方案。如果您没有构建脚本,maven可能值得研究


    依赖项管理自动为您直接使用的依赖项(JAR)提取可传递的依赖项。

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

    • 右键单击项目
    • 选择“属性”-->“部署程序集”-->“添加”-->“Java生成路径项”
    • 选择要添加到web应用的所有库

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

    为什么要将所有依赖项都放在一个jar中?简单地将它们全部放入
    WEB-INF/lib
    ,有什么不对?(另外:您不需要任何类路径条目,webapp可以自动访问
    WEB-INF/lib
    )中的所有jar文件。我更愿意让我的jar文件自包含且可分发,而不是在WEB-INF/lib中分解不必要的依赖关系。它们不是不必要的,是吗?如果您想要一个自包含的jar,那么就不要使用外部库。只有一个词:maven。但你似乎面对的是错误的方向。一个自包含的web应用程序只由WAR文件而不是JAR文件表示。将依赖项放在WEB-INF/lib中并不会使它或多或少具有可分发性。如果jar文件A试图访问jar文件B中的类,并且A和B都在战争中,我就遇到了同样的问题!