在我们的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“
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)
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中创建的,但大部分工作正常。
有人有同样的问题吗?
是不是,问题是因为我们正在使用的部署机制?我们使用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/}
答案 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)
感谢提示用户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>