Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JBoss 7.1.1: add rt.jar of jre to classpath

My goal is to deploy an ear file in JBoss 7.1.1. One of the classes in the ear file (which I cannot change) is using sun.net.util.IPAddressUtil class of JRE's rt.jar.

In my IDE (eclipse) resolves this class and it compiles normally. But when I try to deploy (the ear containing the class) on JBoss 7.1.1, it gives me java.lang.NoClassDefFoundError: sun/net/util/IPAddressUtil. JAVA_HOME variable is set in my machine and I see that both JBoss and eclipse use the same JDK (1.6.X)

When I bundle the EAR with rt.jar in lib folder, the EAR deploys properly (which is a bad approach).

I have looked at JBoss community which says to configure as module for any third-party jars. However, the class I need is with in the rt.jar, I'm not in favor of adding it as module

Is there a way to configure JBoss 7.1.1 to manually look at %JAVA_HOME%/jre/lib/rt.jar ?

Thanks in advance.

like image 283
Chris Avatar asked Sep 19 '12 10:09

Chris


1 Answers

JBoss 7 use jboss-modules technology for modular class-loading, similar to OSGi. It will use rt.jar and a bunch of libraries in its own lib directory to start the application server itself. But when it will load your web application, it will create a custom classloader which restricts what classes it will see, based on the module dependencies it declares.

To declare module dependencies, you need to include a jboss-deployment-structure.xml in the META-INF directory of your EAR (or WEB-INF for a WAR). See https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7. To declare a dependency on classes in the rt.jar, you need a <system> dependency:

<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>

You could also try to extract the IPAddressUtil class and package it as a separate module. You can get the sources from the openjdk, e.g. http://www.docjar.com/html/api/sun/net/util/IPAddressUtil.java.html

like image 72
GeertPt Avatar answered Oct 18 '22 17:10

GeertPt