繁体   English   中英

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

[英]How to add /usr/share/java libs to webapp's classpath?

摘要

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

细节

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

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

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

不好的解决

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

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

根据Tomcat类加载文档 ,您需要在$ CATALINA_BASE / shared / lib库中放置任何应该对所有Tomcat应用程序可用的共享库 - 所以一种方法来执行您要执行的操作是移动库从/ usr / share / java到$ CATALINA_BASE / shared / lib。

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

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

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

修改如下:

  1. 取决于所有依赖项的特定包版本(在deb打包时影响“控制”文件)
    instead of just 例如: 而不仅仅是
  2. 符号链接到`/ usr / share / java`中的实际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”。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM