2015-10-08 69 views
0

對不起,我是新來的,但我有問題我希望有人能幫我解決。>>> URI不是分層的

此代碼運行在日食完美一段時間,但之後編譯它說的:

java.lang.IllegalArgumentException異常:URI不分層

任何幫助將撥付,謝謝!

public void loadMods(String pkg) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { 
    List<Class<?>> classes = getClasses(pkg); 
    for(Class<?> c : classes) { 
     for (Method m : c.getMethods()) { 
      Object o = null; 
      o = c.newInstance(); 
      if (m.getName().contains("load")) { 
       m.setAccessible(true); 
       m.invoke(o); 
      } 
     } 
    } 
} 

public static List<Class<?>> getClasses(String pkg) { 
    String pkgname = pkg; 
    List<Class<?>> classes = new ArrayList<Class<?>>(); 
    File directory = null; 
    String fullPath; 
    String relPath = pkgname.replace('.', '/'); 
    URL resource = ClassLoader.getSystemClassLoader().getResource(relPath); 
    if (resource == null) { 
     throw new RuntimeException("No resource for " + relPath); 
    } 
    fullPath = resource.getFile(); 
    try { 
     directory = new File(resource.toURI()); 
    } catch (URISyntaxException e) { 
     throw new RuntimeException(pkgname + " (" + resource + ") invalid URL/URI.", e); 
    } catch (IllegalArgumentException e) { 
     directory = null; 
    } 
    if (directory != null && directory.exists()) { 
     String[] files = directory.list(); 
     for (int i = 0; i < files.length; i++) { 
      if (files[i].endsWith(".class")) { 
       String className = pkgname + '.' + files[i].substring(0, files[i].length() - 6); 
       try { 
        classes.add(Class.forName(className)); 
       } catch (ClassNotFoundException e) { 
        throw new RuntimeException("ClassNotFoundException loading " + className); 
       } 
      } else { 
       String pkgnamex = pkgname + '.' + files[i]; 
       List<Class<?>> classesx = new ArrayList<Class<?>>(); 
       File directoryx = null; 
       String fullPathx; 
       String relPathx = pkgnamex.replace('.', '/'); 
       URL resourcex = ClassLoader.getSystemClassLoader().getResource(relPathx); 
       if (resourcex == null) { 
        throw new RuntimeException("No resource for " + relPathx); 
       } 
       fullPathx = resourcex.getFile(); 
       try { 
        directoryx = new File(resourcex.toURI()); 
       } catch (URISyntaxException e) { 
        throw new RuntimeException(pkgnamex + " (" + resourcex + ") invalid URL/URI.", e); 
       } catch (IllegalArgumentException e) { 
        directoryx = null; 
       } 
       if (directoryx != null && directoryx.exists()) { 
        String[] filesx = directoryx.list(); 
        for (int ix = 0; ix < filesx.length; ix++) { 
         if (filesx[ix].endsWith(".class")) { 
          String classNamex = pkgnamex + '.' + filesx[ix].substring(0, filesx[ix].length() - 6); 
          try { 
           classes.add(Class.forName(classNamex)); 
          } catch (ClassNotFoundException e) { 
           throw new RuntimeException("ClassNotFoundException loading " + classNamex); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
    return classes; 
} 
+2

[Java Jar文件:使用資源錯誤:URI不是分層]的可能重複(http://stackoverflow.com/questions/10144210/java-jar-file-use-resource-errors-uri-is-not -hierarchical) – SomeJavaGuy

+1

[爲什麼我的URI不是分層的]可能的重複(http://stackoverflow.com/questions/18055189/why-my-uri-is-not-hierarchical) –

回答

0

當您在Eclipse中運行代碼時,它使用編譯類(默認情況下位於'target'文件夾中)。但是,如果通常從外部運行代碼,則使用由Eclipse創建的JAR文件。

而這個問題出現在引用JAR內部的東西時,這是由鏈接的問題解釋的。

簡而言之:文件系統中的URI在語法上是正確的。將某些東西引用到JAR中的URI不再是有效的URI。

+0

加載相同JAR中包含的mod是有問題的。如果您有可選模塊,那麼可以使用更好的技術來實現,例如OSGI或服務提供商。您也可以嘗試使用ProtectionDomain,但這很棘手,並且可能因安全限制而失敗。 – Sebastian

+0

好吧,我終於找到了一種方法去做我想做的事情,我只是想我會與大家分享,以防萬一有人在路上嘗試做我正在做的事情並且失敗。 這裏是我有工作的源代碼:https://github.com/SoWhoYou/breakcraft/blob/master/mod/ModLoader.java – SoWhoYou

+0

感謝您提供的代碼。它在更深層次上需要幾分鐘才能分析它。沒有侮辱,但它看起來有問題:1沒有JavaDoc 2所有方法都是公共的,但一個修改了其他方法的行爲改變的成員=>以不同的順序調用方法可能會給出不同的結果3)沒有私有構造函數來防止意外實例化4)通過使用更多的API,代碼可以縮短5)通過使用Set而不是List 6,性能可能會更好)沒有測試。代碼看起來非常適合配對編程 – Sebastian