运行时之后的Java加载jar无法正常工作

时间:2014-11-01 01:11:58

标签: java swt classloader

当我使用this帖子中的代码加载swt jar时,我遇到了以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/SWT                                                       
        at chrriis.dj.nativeswing.swtimpl.core.SWTNativeInterface.initialize_(SWTNativeInterface.java:213)                           
        at chrriis.dj.nativeswing.swtimpl.NativeInterface.initialize(NativeInterface.java:71)                                        
        at chrriis.dj.nativeswing.swtimpl.core.SWTNativeInterface.open_(SWTNativeInterface.java:337)                                 
        at chrriis.dj.nativeswing.swtimpl.NativeInterface.open(NativeInterface.java:100)                                             
        at derby.DerbyProgram.<init>(DerbyProgram.java:161)                                                                          
        at derby.DerbyProgram.getInstance(DerbyProgram.java:130)                                                                     
        at derby.DerbyProgram.main(DerbyProgram.java:121)                                                                            
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.SWT                                                                     
        at java.net.URLClassLoader$1.run(URLClassLoader.java:372)                                                                    
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)                                                                    
        at java.security.AccessController.doPrivileged(Native Method)                                                                
        at java.net.URLClassLoader.findClass(URLClassLoader.java:360)                                                                
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)                                                                     
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)                                                             
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)                                                                     
        ... 7 more

addURL似乎将jar添加到列表中,而不是实际加载它。我使用-verbose参数启动了我的程序,它没有说明加载我需要的SWT类。我确保仔细检查库,确实该类存在并位于正确的目录中。

这是我的代码:

public static void main(String[] args){
        try {
            loadSWTJar();
        }
        catch (MalformedURLException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
        NativeInterface.open();//This throws the exception
}


private void loadSWTJar() throws MalformedURLException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
        String osName = System.getProperty("os.name").toLowerCase();
        String osArch = System.getProperty("os.arch").toLowerCase();
        URLClassLoader classLoader = (URLClassLoader) getClass().getClassLoader();
        Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
        addUrlMethod.setAccessible(true);
        String swtFileNameOsPart = osName.contains("win") ? "win" : osName.contains("mac") ? "maco" : osName.contains("linux") || osName.contains("nix") ? "linux" : ""; // throw new RuntimeException("Unknown OS name: "+osName)
        String swtFileNameArchPart = osArch.contains("64") ? "64" : "32";
        String swtFileName = "swt-" + swtFileNameOsPart + "-" + swtFileNameArchPart + ".jar";
        URL swtFileUrl = new URL("file:" + System.getProperty("user.dir") + "/lib/"+swtFileName);
        addUrlMethod.invoke(classLoader, swtFileUrl);
        System.out.println("Loaded SWT jar: " + swtFileUrl);//This outputs the correct path and file. That file contains the correct stuff in it.
    }

以下是正在访问的SWT.class: enter image description here 其他库是DJ Native SwingSWT。 有什么想法吗?

0 个答案:

没有答案