我是 Jboss 的新手,但我有多个 Web 应用程序,每个应用程序都使用 spring-hibernate 和其他开源库和 portlet,所以基本上现在每个 war 文件都包含那些 jar 文件。如何将这些 jar 移动到一个公共(public)位置,这样我就不必将它们放在每个 war 文件中?我猜位置是 server/default/lib
,但我不确定。
此外,将这些 jar 放在 WEB-INF/lib
与 JBOSS/server/default/lib
有何不同?我会遇到任何类加载器问题吗?
我还有静态数据存储在静态字段中,例如 Singleton
,这些数据会在所有 WAR 文件中共享吗?
最佳答案
类加载:
你是对的,把.jar
s 至 JBOSS/server/<configuration>/lib
, 或 JBOSS/lib
.
JBoss AS 附带捆绑的 Hibernate 库,这些库已使用该 AS 版本进行测试。
参见 jboss-6.0.0-SNAPSHOT\server\default\conf\jboss-service.xml
:
<server>
<!-- Load all jars from the JBOSS_HOME/server/<config>/lib directory and
the shared JBOSS_HOME/common/lib directory. This can be restricted to
specific jars by specifying them in the archives attribute.
TODO: Move this configuration elsewhere
-->
<classpath codebase="${jboss.server.lib.url}" archives="*"/>
<classpath codebase="${jboss.common.lib.url}" archives="*"/>
</server>
另见:
- http://community.jboss.org/wiki/classloadingconfiguration
- http://community.jboss.org/wiki/JbossClassLoadingUseCases
WEB-INF/lib
之间的区别和 JBOSS/server/default/lib
:
WEB/lib
中的库与您的 WAR 一起出现,并且仅在该 WAR 中可见。
如果您有其他模块,例如EJB JAR,它们从中不可见,你会得到 ClassNotFoundException
或者(如果你在多个地方上课)ClassCastException
.
JBOSS-AS/server/<config>/lib
中的库对整个服务器可见,因此所有已部署的应用程序及其模块。但是(IIRC)它们没有优先权,所以如果你带那个库,例如在 WAR 中,而不是在 EJB jar 中,您最终可能会使用两个不同的版本,这是不可取的(可能会导致上述 ClassCastException
)。
类加载行为可以通过多种方式进行调整,参见例如JBoss wiki .
静态数据:
不要依赖 Java EE 中的静态字段,那会带来麻烦。例如,。同一个类可以被不同的类加载器加载,所以这些静态值会有多个实例。
如果你想在多个 WAR 之间共享数据,请使用外部存储 - 数据库、文件(如果你写入它,则同步)、JBoss 缓存等。
关于java - JBoss AS 5 中的共享库放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2108975/