3

概括

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

细节

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

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

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

糟糕的解决方案

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

这不是很好,因为我必须对很多 jar 进行符号链接,更糟糕的是对我的直接依赖库(jar)需要的所有 jar 进行符号链接(等等)。如果我的直接依赖库更改了它所需的 jar 列表,我将不得不维护该符号链接。

4

4 回答 4

2

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

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

于 2008-09-22T14:42:14.083 回答
1

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

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

修改如下:

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

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

于 2008-09-22T17:24:57.203 回答
0

您有两种选择,一种是让类加载器向所有 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”。

于 2008-09-22T14:49:40.417 回答
-2

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

这保证了您的应用程序无论在何处部署都将表现相同,并且您不会受到 /usr/share/java... 中库版本的意外更改的影响。

于 2008-09-22T15:21:11.277 回答