部署在linux + tomcat5.5上的webapp可以自动使用/看到所有的/usr/share/java/
jars吗?
我正在打包我的Java的Web应用程序的Ubuntu(但问题是与任何基于Linux的发行版),并将使其依赖于tomcat。
我将把上下文描述符(一个xml文件)放到/usr/share/tomcat5.5/conf/Catalina/localhost/
,以便部署我的应用程序。 让我的网页目录在这里: /usr/share/<appname>/web
,我怎样才能让我的应用程序使用系统中安装的java jar库( /usr/share/java
)?
我不能只是symlink /usr/share/java -> <webdir>/WEB-INF/lib
,因为我有我的自定义jar需要放在lib
目录下。
我目前find的解决scheme是将每个需要的jar符号链接到<webdir>/WEB-INF/lib/
。
这不是很好,因为我必须符号链接很多jar,甚至更糟糕的是符号链接我的直接依赖库(jar)所需的所有jar(依此类推)。 如果我的直接依赖关系库更改所需的jar子列表,我将不得不保持符号链接。
你不应该这样做。 Java EE应用程序应该是自给自足的,不依赖于除了容器提供的部署包以外的任何资源。 所以你应该从目录中拿出你需要的库,并将其添加到你的战争或耳朵包。
这可以确保您的应用程序在您部署它的任何位置都将保持一致,并且不会受到/ usr / share / java中lib版本的意外更改…
根据Tomcat类加载文档 ,您需要将任何应该可用的共享库放到$ CATALINA_BASE / shared / lib库中的所有Tomcat应用程序中 – 所以您要做的一种方法是将库从/ usr / share / java到$ CATALINA_BASE / shared / lib。
如果我不误解同一文档,Tomcat也会在启动时使系统范围的CLASSPATH变量的内容可用于类加载器,所以如果您的目录 – / usr / share / java包含在系统范围的CLASSPATH中变量,那么也应该工作。 虽然我从来没有这样做过, Tomcat使$ CATALINA_BASE / shared / lib的内容可用于Tomcat的方法一直是完美的。
entzik的答案引导我到以下解决方案。
我将使用修改过的“不好的解决方案”(请参阅问题)。
修改如下:
如果管理员安装了新版本的库(例如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”中获取的。