在部署期间自动在WEB-INF / lib下加载Java EE类

时间:2014-01-22 18:19:44

标签: java class java-ee jboss classloader

我正在解决多个应用程序需要共享彼此加载的类的问题。

所以我开始创建一个单独的应用程序并将所有公共库放入其中。我还做了必要的应用程序服务器特定的启用/配置更改。我试图找到可以在部署战争后立即加载WEB-INF / lib / * .jar下的所有类。

假设我不希望使用ie Foo.class单独加载类。我真的试图看看是否可以通过启用配置手动加载WEB-INF / lib下的所有类来编写JAVA代码。

2 个答案:

答案 0 :(得分:1)

如果您尝试在多个Web应用程序中共享库,则需要将这些库放在JBOSS的共享库文件夹中。 JBOSS将在启动时加载。

见:

Where to put a shared library in JBoss AS 5?

webapp无法访问其他webapp类加载器。 应用程序类加载器可以访问3个类加载器:

  1. 自己的类加载器
  2. Container classloader
  3. Bootstrap类加载器(加载Java SDK类)。

答案 1 :(得分:1)

如果我们通过你提到的不同点:

  • 我正在解决多个应用程序需要共享彼此加载的类的问题: 将这些类放在服务器级别的公共类加载器中,并且将它们从WARs WEB-INF / lib中删除,以避免WAR类隐藏服务器类。例如,在Tomcat的情况下,将罐子放在$TOMCAT_HOME/lib中。

  • 为什么这不是一个好主意:这通常不是一个好主意,我们应该只在服务器级别放置所需的最小类,以避免由于静态变量引起的问题(与班级相关联)无意间在申请中共享,增加了阶级演员例外的可能性等。

  • 所以我开始创建一个单独的应用程序并将所有公共库放入其中: 这将无法正常工作,一个WAR应用程序的WEB-INF / lib是隔离的,在另一个WAR的类中不可见。因此,创建单独的应用程序不是实现此目的的方法,而是在服务器级别的类加载器上安装类。

  • 我试图在部署战争后尽快加载WEB-INF / lib / .jar下的所有类:* 这在servlet容器中没有预见到,请参阅此answer以了解使用Java代码执行此操作的方法。此功能不可用的原因是JVM在其他类需要时懒惰地加载类,并且没有为了节省内存而进行前期加载。

加载类的时刻最好留给JVM的内部工作,其中有许多优化以最有效的方式加载类并避免perm gen问题。

如果没有回答问题,您可以告诉我们您需要预先加载课程的用例,我们可能会为您要实施的内容提供一些替代方案 - 例如增加初始请求的超时时间,等