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

时间:2008-09-22 14:37:56

标签: java linux tomcat web-applications classpath

摘要

部署在linux + tomcat5.5上的webapps可以自动使用/查看所有/usr/share/java/个罐子吗?

详细

我正在为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,因为我的自定义广告需要放在lib目录中。

不良解决方案

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

这不是很好,因为我必须符号链接很多jar,甚至更糟糕的是符号链接我的直接依赖lib(jar)所需的所有jar(依此类推)。如果我的直接依赖库lib更改了所需的jar列表,​​我将不得不维护该符号链接。

4 个答案:

答案 0 :(得分:2)

根据the Tomcat classloading documentation,你需要在$ CATALINA_BASE / shared / lib库中放置任何应该对所有Tomcat应用程序可用的共享库 - 所以一种方法来做你想做的事情就是将库从/ usr / share / java移动到$ CATALINA_BASE / shared / lib。

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

答案 1 :(得分:1)

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

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

修改如下:

     
  1. 取决于所有依赖项的特定包版本(在deb打包时影响“控制”文件)例如: libcommons-io-java(= 1.3.1)而不是< I> libcommons-IO-java的的  
  2. 符号链接到`/ usr / share / java`中的实际jar文件,而不是“通用”的例子:例如:
    webdir / WEB-INF / lib / commons- io.jar - &gt; /usr/share/java/commons-io-1.3.1.jar
    而不是 webdir / WEB-INF / lib / commons-io.jar - &gt; /usr/share/java/commons-io.jar
  3. 如果管理员安装了新版本的库(例如commons-io),则此修改可确保不会破坏webapp。

    缺点是这种方法明显地使系统只使用一个应用程序版本的库,并且可能导致一些其他应用程序/库因版本冲突而无法安装的问题。如果我们谈论图书馆,我想这两个潜在的问题都很小。

答案 2 :(得分:0)

你有两个选择,一个是让类加载器为所有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 :(得分:-2)

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

这可以保证您的应用程序在部署它的任何地方都会表现相同,并且您不会在/ usr / share / java ....中的lib版本中发生意外更改。