2013-03-12 83 views
2

我目前從java 1.6切換到1.7,發現我的代碼不會因爲ClassDefNotFound異常而運行。所有帶有UTF8類名的類都會引發異常(中文字符是特定的)。有誰知道爲什麼java 1.7失去了對非英文字符類和包名稱的支持?Java SE 1.7 ClassDefNotFound

這裏是堆棧跟蹤:

java.lang.NoClassDefFoundError: badstudent/mappings/北京/北京Mappings 
    at badstudent.mappings.AllProvinceMappings.initMappings(AllProvinceMappings.java:42) 
    at badstudent.mappings.MappingBase.<init>(MappingBase.java:22) 
    at badstudent.mappings.AllProvinceMappings.<init>(AllProvinceMappings.java:38) 
    at badstudent.common.Constants.<clinit>(Constants.java:24) 
    at badstudent.mappings.MappingManager.getProvinceMappings(MappingManager.java:18) 
    at badstudent.mappings.MappingManager.getAllCity(MappingManager.java:46) 
    at badstudent.dao.test.SpeedTest.javaAllCity(SpeedTest.java:22) 
    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:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.ClassNotFoundException: badstudent.mappings.北京.北京Mappings 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.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:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 30 more 
+1

你能在這裏發表錯誤跟蹤? – bjedrzejewski 2013-03-12 13:36:33

+0

你看過這個嗎? http://stackoverflow.com/questions/13588940/different-behaviour-between-javac-1-6-and-javac-1-7-when-handling-special-charac – 2013-03-12 13:37:57

+0

這是我用英文編碼的確切場景all時間 - 儘管這不是我的母語...... – ppeterka 2013-03-12 13:40:05

回答

0

有腳本 確保找到自己的JAVA_HOME和LAUNCHER_JAR路徑

#!/bin/sh 
export JAVA_HOME=/Library/Java/JavaVirtualMachines/1.7.0_15.jdk/Contents/Home 
LAUNCHER_JAR=/Applications/eclipse/plugins/org.eclipse.equinox.launcher_1.3.0.v20120522- 1813.jar 

java \ 
-showversion \ 
-XX:MaxPermSize=256m \ 
-Xms1024m \ 
-Xmx1024m \ 
-Xdock:icon=/Applications/eclipse/Eclipse.app/Contents/Resources/Eclipse.icns \ 
-XstartOnFirstThread \ 
-Dorg.eclipse.swt.internal.carbon.smallFonts \ 
-Dosgi.requiredJavaVersion=1.5 \ 
-jar $LAUNCHER_JAR 
0

好了,已經有增強用Java 1.7,但沒有涉及到UTF-8去除支持 - 看 Internationalization Enhancements in Java SE 7以獲取更多信息。

您正在使用哪種環境?我使用Eclipse和,試圖保存類與中國的一個字符。當我得到以下錯誤:

Error in Eclipse

-

在任何情況下,按照Oracle的documentation on Charsets

Every instance of the Java virtual machine has a default charset, which may or may not be one of the standard charsets. The default charset is determined during virtual-machine startup and typically depends upon the locale and charset being used by the underlying operating system.

據我所知,Java 1.7的默認值是CP-252(對於Windows)或MacRoman(對於Mac),這可以解釋你遇到的問題的原因。

您可以使用以下方法來找出編碼在你的系統中使用:

System.getProperty("sun.jnu.encoding"); 

我建議你也嘗試以下,以確保您的系統設置爲使用UTF-8相應:

JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF8 

希望上面會有幫助,但如果不是那麼一些其他的東西來看待是:

  1. 如果你把你的環境改回到1.6,這是否解決了這個問題?
  2. 當您試圖編譯任何帶有中文字符的類時,您是否得到完全相同的錯誤?
  3. 漢字是有這個問題的類之間的唯一模式嗎?

祝你好運!

+0

我解決了這個問題。原因是我在Mac環境中,Mac上的Java1.7是由Oracle製作的,因此在啓動時eclipse無法識別1.7。我有一個腳本會強制eclipse在啓動時加載java1.7,但腳本需要根據不同的環境進行修改。給我留言,如果你需要的腳本。 – 2013-04-30 17:56:42

+0

@MichaelYuzhihengXiao你可以發佈並接受你的解決方案嗎? – longhua 2013-05-06 08:53:42