如何将/ usr / share / java libs添加到webapp的类路径中?

时间:2020-03-06 14:32:33  来源:igfitidea点击:

概括

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

细节

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

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

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

不好的解决方案

到目前为止,我发现的解决方案是将每个必需的jar符号链接到&lt;webdir> / WEB-INF / lib /

这不是很好,因为我必须对很多jar进行符号链接,甚至更糟糕的是,对我直接依赖库(jar)要求(依此类推)的所有jar进行符号链接。万一我的直接依赖库更改了所需jar的列表,我将必须维护该符号链接。

解决方案

根据Tomcat类加载文档,我们需要将所有可用于所有Tomcat应用程序的共享库都放在$ CATALINA_BASE / shared / lib库中,因此,一种方法是将库从/ usr / share / java到$ CATALINA_BASE / shared / lib。

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

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

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

我还应注意,这些目录位置来自Ubuntu" Feisty"。

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

这样可以保证应用程序在部署时的行为都一样,并且不会受到/ usr / share / java ...中lib版本的意外更改。

entzik的答案将我引向以下解决方案。

我将使用修改后的"不良解决方案"(请参阅​​问题)。

修改如下:

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

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