如何将/ usr / share / java libs添加到webapp的类路径中?
概括
部署在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-> <webdir> / WEB-INF / lib
,因为我需要将自定义的jar放在lib
目录中。
不好的解决方案
到目前为止,我发现的解决方案是将每个必需的jar符号链接到<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不会损坏。
缺点是,这种方法显然会使仅一个应用程序使用的库版本使系统膨胀,并可能由于版本冲突而导致某些其他应用程序/库无法安装的问题。如果我们谈论图书馆,我猜这两个潜在的问题都是次要的。