【问题标题】:How to add /usr/share/java libs to webapp's classpath?如何将 /usr/share/java 库添加到 webapp 的类路径?
【发布时间】:2010-09-12 00:39:03
【问题描述】:

总结

部署在 linux + tomcat5.5 上的 webapp 是否可以自动使用/查看所有 /usr/share/java/ jar?

详情

我正在为 Ubuntu 打包我的 java webapp(但问题与任何基于 linux 的发行版有关),并将使其依赖于 tomcat。

我要将上下文描述符(一个 xml 文件)放入 /usr/share/tomcat5.5/conf/Catalina/localhost/ 以部署我的应用程序。 在这里有我的网络目录:/usr/share/<appname>/web,我怎样才能让我的应用程序使用系统中安装的 java jar 库 (/usr/share/java)?

我不能只符号链接/usr/share/java -> <webdir>/WEB-INF/lib,因为我的自定义 jar 需要放在 lib 目录中。

糟糕的解决方案

到目前为止我找到的解决方案是将每个所需的 jar 符号链接到 <webdir>/WEB-INF/lib/

这不太好,因为我必须对很多 jar 进行符号链接,更糟糕的是对我的直接依赖库 (jar) 需要的所有 jar 进行符号链接(等等)。如果我的直接依赖库更改了它所需的 jar 列表,我将不得不维护这些符号链接。

【问题讨论】:

    标签: java linux tomcat web-applications classpath


    【解决方案1】:

    根据the Tomcat classloading documentation,您需要将所有 Tomcat 应用程序都应该可用的任何共享库放在 $CATALINA_BASE/shared/lib 库中——所以一种方法是移动你的库从 /usr/share/java 到 $CATALINA_BASE/shared/lib。

    但是,如果我没有误解相同的文档,Tomcat 还会在启动时为类加载器提供系统范围的 CLASSPATH 变量的内容,所以如果您的目录 - /usr/share/java - 包含在系统中-wide CLASSPATH 变量,那么它也应该起作用。不过,我从来没有这样做过; Tomcat 使 $CATALINA_BASE/shared/lib 的内容在 Tomcat 范围内可用的方法一直对我很有帮助。

    【讨论】:

      【解决方案2】:

      你有两种选择,一种是让类加载器向所有java程序提供库,另一种是让类加载器向所有tomcat上下文提供库。

      将您的符号链接添加到 /usr/lib/jvm/java-1.5.0-sun-1.5.0.11/jre/lib(请注意,您可能需要在此路径中指定不同的版本)以允许所有 java 程序访问这些库或将它们添加到 Tomcat 的 var/lib/tomcat5.5/shared/libs 共享库中(同样,版本号可能不同)以供所有 Tomcat 上下文访问。

      我还应该注意,这些目录位置取自 Ubuntu “Feisty”。

      【讨论】:

        【解决方案3】:

        你不应该那样做。 Java EE 应用程序应该是自给自足的,并且不依赖于部署包之外的任何资源,而不是容器提供的资源。因此,您应该从该目录中获取所需的库并将其添加到您的 war 或 ear 包中。

        这保证了您的应用程序无论在何处部署都将保持相同的行为,并且您不会受到 /usr/share/java.. 中库版本的意外更改的影响。

        【讨论】:

        • 我可以从您的回答中看出原因,甚至可以同意您的看法。这导致了巨大的 .deb 包的问题,​​并且明显违背了 linux 发行版的打包理念。我倾向于以与 .so 文件相同的方式考虑 .jar。这是否意味着 Linux 发行版不太适合打包 Web 应用程序?
        • 我已决定将具体 jar 符号链接到 webapp 的 lib 目录中,并依赖具体版本的库以确保 /usr/share/java 中的更改不会影响我的应用程序(请参阅我对这个问题)
        【解决方案4】:

        entzik 的回答引导我找到以下解决方案。

        我将使用修改后的“坏解决方案”(见问题)。

        修改如下:

        1. 依赖于所有依赖项的特定包版本(在打包 deb 时影响“控制”文件)
          示例:libcommons-io-java (= 1.3.1) 而不仅仅是 libcommons-io-java
        2. 符号链接到 `/usr/share/java` 中的实际 jar 文件,而不是“通用”文件
          示例:
          webdir/WEB-INF/lib/commons-io.jar -> / usr/share/java/commons-io-1.3.1.jar
          而不是
          webdir/WEB-INF/lib/commons-io.jar -> /usr/share/ java/commons-io.jar

        如果管理员安装了新版本的库(例如 commons-io),此修改可确保 webapp 不会损坏。

        缺点是这种方法显然会使用仅由一个应用程序使用的库版本来膨胀系统,并可能导致由于版本冲突而无法安装其他应用程序/库的问题。如果我们谈论图书馆,我想这两个潜在的问题都是次要的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多