为什么jdk 1.5无法加载使用maven创建的jar? (版本号错误)

发布于 2024-09-14 18:36:28 字数 3518 浏览 1 评论 0原文

我使用的是solaris,我在jdk 1.6上创建了一个maven应用程序,但使用maven-compiler-plugin将目标指定为1.5。这是我的 pom.xml 的片段:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.5</source>
      <target>1.5</target>
    </configuration>
  </plugin>

虽然当我尝试在 solaris 框中运行时,我得到:

bash-2.05$ ./merchantInfoUpdate.sh 
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

如果我运行 mvn install -X (带调试)并且编译器插件告诉我:

[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile' -->
[DEBUG]   (f) basedir = /home/emerson/newworkspace/java-batch-updater
[DEBUG]   (f) buildDirectory = /home/emerson/newworkspace/java-batch-updater/target
[DEBUG]   (f) classpathElements = [/home/emerson/newworkspace/java-batch-updater/target/classes, /home/emerson/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar, /home/emerson/.m2/repository/log4j/log4j/1.2.12/log4j-1.2.12.jar]
[DEBUG]   (f) compileSourceRoots = [/home/emerson/newworkspace/java-batch-updater/src/main/java]
[DEBUG]   (f) compilerId = javac
[DEBUG]   (f) debug = true
[DEBUG]   (f) failOnError = true
[DEBUG]   (f) fork = false
[DEBUG]   (f) optimize = false
[DEBUG]   (f) outputDirectory = /home/emerson/newworkspace/java-batch-updater/target/classes
[DEBUG]   (f) outputFileName = com.company.ingestion.updater-2010.01
[DEBUG]   (f) projectArtifact = com.yell:com.company.ingestion.updater:jar:2010.01
[DEBUG]   (f) showDeprecation = false
[DEBUG]   (f) showWarnings = false
[DEBUG]   (f) source = 1.5
[DEBUG]   (f) staleMillis = 0
[DEBUG]   (f) target = 1.5
[DEBUG]   (f) verbose = false

emerson@emerson-desktop:~/newworkspace/java-batch-updater/target/expand$ file com/yell/ingestion/updater/ListingsManager.class

com/yell/ingestion/updater/ListingsManager.class: compiled Java class data, version 50.0 (Java 1.6)

Java版本:

bash-2.05$ java -version
java version "1.5.0_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-b05)
Java HotSpot(TM) Server VM (build 1.5.0_05-b05, mixed mode)

启动脚本内容:

bash-2.05$ more merchantInfoUpdate.sh 
LIB=lib

   CLASSPATH="."
   for i in `find $LIB  -name *.jar`; do CLASSPATH="$CLASSPATH:$i"; done;
    export CLASSPATH
   CLASSPATH=$CLASSPATH:resources/properties
java  $* -cp $CLASSPATH com.company.ingestion.updater.ListingsManager 

我确保它实际上是我正在构建的jar导致了问题,将其单独留在应用程序类路径中,但我仍然得到相同的错误。

有什么想法吗?

谢谢

I'm using solaris, I created a maven app on jdk 1.6 but using the maven-compiler-plugin to specify the target as 1.5. Here is the snippet of my pom.xml:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.5</source>
      <target>1.5</target>
    </configuration>
  </plugin>

Although when I try to run in the solaris box I get:

bash-2.05$ ./merchantInfoUpdate.sh 
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

And if I run the mvn install -X (with debug) and the compiler plugin tells me:

[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile' -->
[DEBUG]   (f) basedir = /home/emerson/newworkspace/java-batch-updater
[DEBUG]   (f) buildDirectory = /home/emerson/newworkspace/java-batch-updater/target
[DEBUG]   (f) classpathElements = [/home/emerson/newworkspace/java-batch-updater/target/classes, /home/emerson/.m2/repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar, /home/emerson/.m2/repository/log4j/log4j/1.2.12/log4j-1.2.12.jar]
[DEBUG]   (f) compileSourceRoots = [/home/emerson/newworkspace/java-batch-updater/src/main/java]
[DEBUG]   (f) compilerId = javac
[DEBUG]   (f) debug = true
[DEBUG]   (f) failOnError = true
[DEBUG]   (f) fork = false
[DEBUG]   (f) optimize = false
[DEBUG]   (f) outputDirectory = /home/emerson/newworkspace/java-batch-updater/target/classes
[DEBUG]   (f) outputFileName = com.company.ingestion.updater-2010.01
[DEBUG]   (f) projectArtifact = com.yell:com.company.ingestion.updater:jar:2010.01
[DEBUG]   (f) showDeprecation = false
[DEBUG]   (f) showWarnings = false
[DEBUG]   (f) source = 1.5
[DEBUG]   (f) staleMillis = 0
[DEBUG]   (f) target = 1.5
[DEBUG]   (f) verbose = false

emerson@emerson-desktop:~/newworkspace/java-batch-updater/target/expand$ file com/yell/ingestion/updater/ListingsManager.class

com/yell/ingestion/updater/ListingsManager.class: compiled Java class data, version 50.0 (Java 1.6)

Java version:

bash-2.05$ java -version
java version "1.5.0_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-b05)
Java HotSpot(TM) Server VM (build 1.5.0_05-b05, mixed mode)

Start script content:

bash-2.05$ more merchantInfoUpdate.sh 
LIB=lib

   CLASSPATH="."
   for i in `find $LIB  -name *.jar`; do CLASSPATH="$CLASSPATH:$i"; done;
    export CLASSPATH
   CLASSPATH=$CLASSPATH:resources/properties
java  $* -cp $CLASSPATH com.company.ingestion.updater.ListingsManager 

I made sure it is actually the jar I'm building which is causing the problem, leaving it alone in the app classpath, and still I get the same error.

Any ideas?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挽袖吟 2024-09-21 18:36:28

您是否绝对确定您在 Solaris 机器上使用的是 Java 1.5,而不是 1.4? java -version 的输出是什么? merchantInfoUpdate.sh 包含什么?它是否将任何其他库 JAR 放入类路径中,这些库 JAR 可以使用 Java 1.6 类文件格式进行编译?

Are you absolutely certain you're using Java 1.5 on the Solaris box, not 1.4? What's the output of java -version there? What does merchantInfoUpdate.sh contain? Does it put any other library JARs into the classpath, which may be compiled using the Java 1.6 class file format?

时光匆匆的小流年 2024-09-21 18:36:28

似乎 Maven 以某种方式得出结论,这些类不需要编译·我用干净的方式重新运行安装,这次我可以看到正确的版本:

mvn clean install

,然后..

文件 /home/emerson/newworkspace/java-batch-updater/target/classes/com/company/ingestion/updater/ListingsManager.class
/home/emerson/newworkspace/java-batch-updater/target/classes/com/company/ingestion/updater/ListingsManager.class:编译的 Java 类数据,版本 49.0 (Java 1.5)

感谢大家的帮助!

艾默生

Seems that somehow maven concludes that the classes don't need to be compiled· I re-run the install with a clean, and this time I could see the right version:

mvn clean install

and then..

file /home/emerson/newworkspace/java-batch-updater/target/classes/com/company/ingestion/updater/ListingsManager.class
/home/emerson/newworkspace/java-batch-updater/target/classes/com/company/ingestion/updater/ListingsManager.class: compiled Java class data, version 49.0 (Java 1.5)

Thanks all for the help!

emerson

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文