JBoss 5.1.0 EAP。随机生成java.lang.NoClassDefFoundError

时间:2013-03-11 08:06:52

标签: java jboss ejb-3.0 noclassdeffounderror

在我们的EJB 3.0应用程序中,我们发生了随机发生的java.lang.NoClassDefFoundError。

它恰好发生在IDE中。

设定:

OS: Windows 7 32 Bit
Java JDK: 1.6.0_24 (32 Bit)‎
IDE: IntelliJ 11.1‎
App-Server: JBoss 5.1.0 EAP
EAR-Building with „maven-ear-plugin“‎
WAR-Building with Maven „<packaging>war</packaging>“‎
EJB-Building with Maven „<packaging>ejb</packaging>“ und „maven-ejb-‎plugin“‎

EAR看起来像这样:

xxx.ear
‎   |___ META-INF
‎   |    |___ application.xml (Information about EAR, EJB und WEB-Modul ‎configured)‎
‎   |‎
‎   |___ xxxEJB.jar‎
‎   |    |‎
‎   |    |___ META-INF
‎   |    |    |___ persistance.xml (JPA 1.0 configuration)‎
‎   |    |    |___ jboss.xml (JBoss-Config)‎
‎   |    |    |___ ejb-jar.xml (EJB 3.0 definition)‎
‎   |    |‎
‎   |    |___ country/yyy/xxx/.. (our own compiled classes)
‎   |    |___ report/.. (JasperReport-Tamplates)
‎   |    |___ quickfix/.. (QuickFixJ-configuration)
‎   |    |___ all dependent libraries for our EJB 3.0 project, (74-jar-files)
‎   | ‎
‎   |___ xxxWAR.war‎
‎        |‎
‎        |___ META-INF
‎        |___ WEB-INF
‎             |‎
‎             |___ lib‎
‎             |    |___ all dependent libraries for the Servlet-‎project, (2-jar-files)
‎             |___ classes‎
‎             |    |___ country/yyy/xxx/.. (our own compiled classes)
‎             |___ web.xml (Servlet-configuration)‎

Stacktrace看起来像这样:

JVM已使用选项:-verbose:class启动,以查看所有类加载操作。

--- SNIP JBoss-Log ---‎

‎[Loaded country.yyy.xxx.service.issue.util.IssueUtil from file:/C:/Workarea/Projects/xxx-‎trunk/xxx/target/classes/]‎
‎[Loaded org.joda.time.DateTimeZone from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.Chronology from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.chrono.BaseChronology from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.DateTimeZone$1 from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.tz.NameProvider from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.JodaTimePermission from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.tz.Provider from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.tz.FixedDateTimeZone from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
‎[Loaded org.joda.time.tz.ZoneInfoProvider from jar:file:/C:/Workarea/Projects/xxx-trunk/xxx-‎ear/target/xxx.ear!/xxxEJB.jar]‎
ERROR - javax.ejb.EJBTransactionRolledbackException: Unexpected Error
java.lang.NoClassDefFoundError: org/joda/time/tz/DefaultNameProvider
at org.joda.time.DateTimeZone.getDefaultNameProvider(DateTimeZone.java:545)‎
at org.joda.time.DateTimeZone.setNameProvider0(DateTimeZone.java:515)‎
at org.joda.time.DateTimeZone.<clinit>(DateTimeZone.java:116)‎
at ‎country.yyy.xxx.service.issue.util.InitialFixingDateTimeUtil.getHedgingTimestampsForIssue(InitialFixingDateTimeUtil.java:83)‎
at ‎country.yyy.xxx.service.issue.util.InitialFixingDateTimeUtil.getFirstHedgingTimestampForIssue(InitialFixingDateTimeUtil.java:43)‎
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)‎
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)‎
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)‎
at java.lang.reflect.Method.invoke(Unknown Source)‎

‎--- SNAP JBoss-Log ---‎

文件“org / joda / time / tz / DefaultNameProvider”肯定在jar文件jar:file:/ C:/ Workarea / Projects / xxx-trunk / xxx-ear / target / xxx.ear!/ xxxEJB.jar

建议:

我们感觉Quarz与它有关。因此,当安排了某些事情时,EJB 3.0远程无状态服务。有时会发生错误。

Quartz-Scheduler最初是在Servlet-Context中创建的,但大部分工作正常。

有人有同样的问题吗?

JBoss部署是通过IntelliJ JBoss插件完成的:

是不是,问题是因为我们正在使用的部署机制?我们使用intelliJ JBoss插件部署应用程序,因此JBoss说:

09:39:21,614 INFO  [MainDeployer] deploy, url=file:/C:/Workarea/Projects/xxx-trunk/xxx-ear/target/xxx.ear
09:39:33,613 INFO  [Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@2726974{vfszip:/C:/Workarea/Projects/xxx-trunk/xxx-ear/target/xxx.ear/xxxEJB.jar/}

2 个答案:

答案 0 :(得分:0)

可能是由于二进制内部的jar冲突(xx.ear)。 您可以使用以下代码在ear文件夹的lib文件夹中找出jar重复

公共类JarSearch {

public static final String NL = System.getProperty("line.separator");

public static String directory = new String();
public static File file;
public static Writer output;

public static void main(String args[]) {
    /*if (args.length != 2){
        System.out.println("You must provide 1. search directory and 2. search string");
        System.exit(0);
    }*/
    JarSearch search = new JarSearch();
    try{
        String dir = "E://lib";//path of lib folder
        directory = dir;
        file = new File(directory);
        String parentPath = file.getParent();
        parentPath += "\\JarSearchResult.txt";
        file = new File(parentPath);
        //output = new BufferedWriter(new FileWriter(file));
        String searchStr = "DES.class";// name of class file to b searched
        search.searchDir(dir, searchStr);//"C:\\Program Files\\IBM\\Application Developer\\plugins\\com.ibm.etools.ctc.binding.java\\runtime\\ctcjava.jar");
    }catch(IOException ioe){
        System.out.println(ioe.toString());
    }
}

public static void searchDir(String dirName, String searchStr)throws IOException{
    File dir = new File(dirName);
    if (!dir.isDirectory()){
        throw new IOException(dir+" is not a directory !!!");
    }
    File files[] = dir.listFiles();
    for (int i=0; i<files.length; i++){
        if (files[i].isDirectory()){
            searchDir(files[i].getAbsolutePath(), searchStr);
        }else{
            if (files[i].getName().endsWith(".jar")){
                searchFile(files[i].getAbsolutePath(), searchStr);
            }
        }
    }
    //output.close();
}

public static void searchFile(String fileName, String searchStr)throws IOException{
    //System.out.println("File Absolute Path :: " + fileName);
    boolean outputMessage = false;
    StringBuffer buf = new StringBuffer();
    int index1 = fileName.lastIndexOf("\\");
    int index2 = fileName.lastIndexOf("/");
    //System.out.println(index1 + " :: " + index2 + " ===>>> " + NL);
    int index = -1;
    if (index1 > index2){
        index = index1;
    } else {
        index = index2;
    }
    buf.append(NL);

    buf.append("DIR: ");
    buf.append(fileName.substring(0, index));
    buf.append(NL);

    buf.append("JAR: ");
    buf.append(fileName.substring(index+1));
    buf.append(NL);

    searchStr = searchStr.toLowerCase();

    JarFile jar = new JarFile(fileName);
    Enumeration e = jar.entries();
    while (e.hasMoreElements()){
        JarEntry entry = (JarEntry)e.nextElement();
        String strEntry = entry.getName().toLowerCase();
        //System.out.println(strEntry);
        if (strEntry.indexOf(searchStr) > -1){
            outputMessage = true;
            buf.append(entry.getName());
            buf.append(NL);
        }
    }
    if (outputMessage){
        System.out.println(buf);
        //output.write(buf.toString());
    }
}

}

答案 1 :(得分:0)

当我们使用IntelliJ IDEA JBoss-Run-Configuration进行部署时,问题就出现了。

感谢提示用户1516873,通过ANT / Maven手动部署。

我们已经尝试过了。

我们引入了一个ANT-Task来将artefact xxx.ear复制到JBoss-Deploy-Folder中。从那时起它工作正常,我们还没有得到java.lang.NoClassDefFoundError。

build.xml看起来像这样:

<project name="xxx-deploy">
    <!-- Copy Artifact to JBoss-Deploy-Folder -->
    <target name="xxx-ear-deploy">
        <copy file="C:/Workarea/Projects/xxx-trunk/xxx-ear/target/xxx.ear"
              todir="C:/Workarea/_tools/jboss-eap-5.1.0-xxx/jboss-as/server/default/deploy"/>
    </target>
</project>
相关问题