如何将/ usr / share / java库添加到webapp的类path中?

概要

部署在linux + tomcat5.5上的webapp可以自动使用/看到所有的/usr/share/java/ jars吗?

细节

我正在打包我的Java的Web应用程序的Ubuntu(但问题是与任何基于Linux的发行版),并将使其依赖于tomcat。

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

我不能只是symlink /usr/share/java -> <webdir>/WEB-INF/lib ,因为我有我的自定义jar需要放在lib目录下。

坏的解决scheme

我目前find的解决scheme是将每个需要的jar符号链接到<webdir>/WEB-INF/lib/

这不是很好,因为我必须符号链接很多jar,甚至更糟糕的是符号链接我的直接依赖库(jar)所需的所有jar(依此类推)。 如果我的直接依赖关系库更改所需的jar子列表,我将不得不保持符号链接。

你不应该这样做。 Java EE应用程序应该是自给自足的,不依赖于除了容器提供的部署包以外的任何资源。 所以你应该从目录中拿出你需要的库,并将其添加到你的战争或耳朵包。

这可以确保您的应用程序在您部署它的任何位置都将保持一致,并且不会受到/ usr / share / java中lib版本的意外更改…

根据Tomcat类加载文档 ,您需要将任何应该可用的共享库放到$ CATALINA_BASE / shared / lib库中的所有Tomcat应用程序中 – 所以您要做的一种方法是将库从/ usr / share / java到$ CATALINA_BASE / shared / lib。

如果我不误解同一文档,Tomcat也会在启动时使系统范围的CLASSPATH变量的内容可用于类加载器,所以如果您的目录 – / usr / share / java包含在系统范围的CLASSPATH中变量,那么也应该工作。 虽然我从来没有这样做过, Tomcat使$ CATALINA_BASE / shared / lib的内容可用于Tomcat的方法一直是完美的。

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

我将使用修改过的“不好的解决方案”(请参阅​​问题)。

修改如下:

  1. 取决于所有依赖项的特定包版本(在打包时影响“控制”文件)
    例如: 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不会中断。

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

您有两个选择,一个是让类加载器将库提供给所有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”中获取的。