ClassNotFoundException 只依赖 JDK7 更新版本?

ClassNotFoundException dependent on JDK7 update version only?

我继承了一个 JBOSS 4.2.3.GA .ear 项目,其中加载了所有内容,如果我使用 JDK 7u45 构建它,运行 没问题,但如果我使用 JDK 7 的任何较新更新(例如 7u76、7u79、7u80)构建它,则无法在 JBoss Bootstrap 早期加载 & 运行。

JBOSS 服务器本身 运行 在 Java 1.7.0_45.

记录的失败原因是 class 的 ClassNofFoundException,它实际上存在(即使是失败的 .ear):

log4j:ERROR Could not create the Layout. Reported error follows.
java.lang.ClassNotFoundException: dbs.common.logger.CsvLayout
        at java.net.URLClassLoader.run(URLClassLoader.java:366)
        at java.net.URLClassLoader.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:190)
        at org.apache.log4j.helpers.Loader.loadClass(Loader.java:178)
        at org.apache.log4j.xml.DOMConfigurator.parseLayout(DOMConfigurator.java:555)
        at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:269)
        at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176)
        at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191)
        at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:523)
        at org.apache.log4j.xml.DOMConfigurator.parseCategory(DOMConfigurator.java:436)
        at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:999)
        at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:867)
        at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:773)
        at org.apache.log4j.xml.DOMConfigurator.configure(DOMConfigurator.java:901)
        at org.jboss.logging.Log4jService$URLWatchTimerTask.reconfigure(Log4jService.java:643)
        at org.jboss.logging.Log4jService$URLWatchTimerTask.run(Log4jService.java:582)
        at org.jboss.logging.Log4jService.setup(Log4jService.java:460)
        at org.jboss.logging.Log4jService.createService(Log4jService.java:476)
        at org.jboss.system.ServiceMBeanSupport.jbossInternalCreate(ServiceMBeanSupport.java:260)
        at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:243)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
        at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
        at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
        at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
        at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
        at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
        at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
        at com.sun.proxy.$Proxy0.create(Unknown Source)
        at org.jboss.system.ServiceController.create(ServiceController.java:330)
        at org.jboss.system.ServiceController.create(ServiceController.java:273)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
        at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
        at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
        at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
        at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
        at com.sun.proxy.$Proxy4.create(Unknown Source)
        at org.jboss.deployment.SARDeployer.create(SARDeployer.java:260)
        at org.jboss.deployment.MainDeployer.create(MainDeployer.java:969)
        at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:818)
        at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
        at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:766)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
        at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
        at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
        at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
        at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
        at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
        at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
        at com.sun.proxy.$Proxy5.deploy(Unknown Source)
        at org.jboss.system.server.ServerImpl.doStart(ServerImpl.java:482)
        at org.jboss.system.server.ServerImpl.start(ServerImpl.java:362)
        at org.jboss.Main.boot(Main.java:200)
        at org.jboss.Main.run(Main.java:508)
        at java.lang.Thread.run(Thread.java:744)

通常,我很容易找到 ClassNofFoundException 的 real 原因,但这次我感到困惑,考虑到以下事实:

  1. .ear 的整个环境(包括 CLASSPATH!)完全相同

  2. 前面提到的 "not found class" dbs.common.logger.CsvLayout 和 common.jar 文件中,它应该在完全相同的路径中成为.

  3. 构建中没有任何错误。

  4. 在其他人的开发工作站(同一个 Eclipse 等)上构建 .ear 和 JDK 7u79(即晚于 7u45 的更新),导致 .ear正确加载和 运行s(在同一服务器和环境中)。

什么可以解释这样的 ClassNofFoundException?

我错过了什么?


更新: 比较工作和不工作 common.jar 文件之间的 "not found" CsvLayout.class,表明 class file format 的 major_version 存在差异。工作的有 0x33 (Java SE 7),失败的有 0x34 (Java SE 8)。

我一直小心翼翼地始终使用仅 jre7 的 执行环境 。那0x34是怎么偷偷进来的?

问题是因为库 common.jar: 是使用 java 8 构建的,没有指定目标 class 文件版本,因此生成了一个具有 java 8 class 个文件版本的 jar 文件。

要使用 Java 8 构建 Java 7 class 文件,您需要

  • 纯java编译:添加目标选项javac -target 1.7 <javafile>
  • maven: 添加 属性 <maven.compiler.target>1.7</maven.compiler.target>
  • 蚂蚁:将 <property name="ant.build.javac.source" value="1.7"/> <property name="ant.build.javac.target" value="1.7"/> 添加到您的 build.xml