7

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 „&lt;packaging>war</packaging>“‎
EJB-Building with Maven „&lt;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にあります

提案:

クォーツはそれと関係があると感じています。したがって、何かがスケジュールされたとき、EJB3.0Remote-Stateless-Serviceから。エラーが発生することがあります。

Quartz-Schedulerは、最初はServlet-Contextで作成されますが、ほとんどの場合は正常に機能します。

誰かが同じ問題を抱えていましたか?

JBossのデプロイメントは、IntelliJJBossプラグインを介して行われます。

問題は、使用している展開メカニズムが原因である可能性がありますか?intelliJ JBoss Pluginを使用してアプリケーションをデプロイするため、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/}
4

2 に答える 2

0

これは、binary(xx.ear)内のjarの競合が原因である可能性があります。以下のコードを使用して、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());
    }
}

}

于 2013-03-12T17:09:55.207 に答える
0

IntelliJ IDEA JBoss-Run-Configurationを使用してデプロイすると、問題が発生します。

ANT/Mavenを介して手動でデプロイするためのヒントを提供してくれたuser1516873に感謝します。

試してみました。

アーティファクトxxx.earをJBoss-Deploy-FolderにコピーするだけのANT-Taskを導入しました。それ以来、正常に動作し、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>
于 2013-03-18T08:55:52.207 に答える