我的目标是在JBoss 7.1.1中部署一个ear文件。 ear文件中的一个类(我无法更改)是使用sun.net.util.IPAddressUtil
类JRE的 rt.jar 。
在我的IDE(eclipse)中解析了这个类并且它正常编译。但是当我尝试在JBoss 7.1.1上部署(包含类的耳朵)时,它给了我java.lang.NoClassDefFoundError: sun/net/util/IPAddressUtil
。我的机器中设置了JAVA_HOME
变量,我发现JBoss和eclipse都使用相同的JDK(1.6.X)
当我在lib文件夹中捆绑带有 rt.jar 的EAR时,EAR正确部署(这是一种不好的方法)。
我查看了JBoss community,其中说要配置为任何第三方jar的模块。但是,我需要的课程是在 rt.jar 中,我不赞成将其添加为模块
有没有办法配置JBoss 7.1.1来手动查看%JAVA_HOME%/jre/lib/rt.jar
?
提前致谢。
答案 0 :(得分:13)
JBoss 7使用jboss-modules技术进行模块化类加载,类似于OSGi。 它将在其自己的lib目录中使用rt.jar和一堆库来启动应用程序服务器本身。 但是当它加载你的web应用程序时,它将创建一个自定义类加载器,根据它声明的模块依赖关系来限制它将看到的类。
要声明模块依赖关系,您需要在EAR的META-INF目录(或WAR的WEB-INF)中包含jboss-deployment-structure.xml。见https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7。要声明对rt.jar中的类的依赖,需要< system>依赖性:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
<dependencies>
<system export="true">
<paths>
<path name="sun/net/util"/>
</paths>
</system>
</dependencies>
</deployment>
</jboss-deployment-structure>
您还可以尝试提取IPAddressUtil类并将其打包为单独的模块。您可以从openjdk获取来源,例如http://www.docjar.com/html/api/sun/net/util/IPAddressUtil.java.html