我正在尝试找到最好的方法来语法确定我的程序是在Jboss 5还是Jboss 7(eap-6.1)上运行。到目前为止我找到的方法是jboss 5或jboss 7具体,这是行不通的,因为代码必须同时工作。从这里尝试了两个解决方案:How do I programmatically obtain the version in JBoss AS 5.1?但它们没有用。一个抱怨org.jboss.Main不存在于jboss 7中,另一个抱怨说没有找到“jmx / rmi / RMIAdaptor”。
我能看到的唯一方法是使用Class.forName查找“org.jboss.Version”(如果jboss 5应该找到),如果失败,请执行Class.forName“org.jboss.util.xml .catalog.Version“(jboss 7)。但这似乎是一个糟糕的主意。
我需要知道战争是在jboss 5还是7上运行的原因是因为有些自定义文件位于两者的不同位置。所以它就像“如果jboss 5,执行这段代码,如果jboss 7执行另一个。
答案 0 :(得分:2)
好的,我刚刚看到了问题所在。
我建议你考虑设计问题/重构你的软件。
如果您想在不同的环境中提供软件,请分离您的逻辑 技术依赖。
构建平面和界面以满足环境要求。
在我的竞争对手中,认为我们必须支持所有集成平台并支持所有版本。这完全不可能。
因此,解耦您的业务逻辑并提供特定的接口。这些接口(适配器)实现和维护起来要简单得多。
希望它有所帮助。
由于评论而更新。
我认为解决方案是使用服务器4到6 JBoss的MBean服务器用于查找已注册的Web应用程序 与已部署的WarFile相关联。
我建议首先使用JBoss jmx-console手动查找Web应用程序的已注册MBean。 WebApplication的名称应该在首都" web"或者"网络部署"在jmx-console中。
如果找到该名称,则可以实现自己的基于jmx的查找机制 检查该名称。
这是一个教程:相当古老,但我认为它可以让你知道如何做。 必须有更多关于此问题的教程:
http://www.theserverside.com/news/1364648/Using-JMX-to-Manage-Web-Applications
在JBoss 7中,我可以给你一个暗示,它的架构基于OSGI。因此,要查找其他服务,您应该查看此机制。
在任何情况下,您都无法直接访问文件系统和部署目录 来自部署在JEE容器中的应用程序,除了 使用容器提供的机制。 JNDI Lookup,JMX ManagedBean机制,Java Connector Archicture(JCA)(在您的情况下毫无意义)
答案 1 :(得分:1)
由于实施完全不同,这不仅仅是一个建议的答案
一种方法可能是使用在引导期间和任何ejb调用之前执行的“拦截器”,并且您可以访问调用上下文,换句话说就是ejb container。
我不能给你任何例子,但这将是一个开始的接入点。
另一个访问点是通过查看来检查系统范围的JMX Bean 管理员JBoss服务器的控制台。 您可以通过Context Mechansim将JMX Bean状态注入到您的应用程序中。 从JMX Managed Bean机制看第4版到第6版。 JMX Achitecture是JBoss 3到6的主要概念,所以此时你可以影响和维护JBoss的行为。
另外,我认为你有4到6.x版本和7.0的差异,因为从那以后 7这是一个全新的架构。从7.0开始,JMX架构不再存在。