2011-07-05 43 views
1

我想從代碼中展開Java類路徑通配符(Java 6中的新增功能)。有沒有我可以使用的Java標準庫中的一些代碼,而不是從頭開始?如何從代碼擴展Java Classpath通配符?

例子:

public static void main(String args[]) { 
     method("~/myApp/build/*:~/myLib/build/lib.jar", "com.myapp.parser.ParseClassFile"); 
    } 

    public static void method(String classpath, String classfile) { 
     actionWithClassFile(javautilmethodexpand(classpath), classfile); 
    } 

在此先感謝

回答

1

是否有一些Java標準庫中的代碼可以用來代替從頭開始?

編號類路徑通配符擴展不是由Java中的標準庫執行的,甚至在JVM加載任何類之前執行擴展。它首先不是一個標準,只有在JRE實現支持它時纔可用。據我所知,Oracle/Sun和OpenJDK運行時允許類路徑通配符擴展。

很明顯,你需要推出自己的實現,如果你打算在Java中這樣做。您可以在位於jdk/src/share/bin目錄中的wildcard.c文件中查找C中的實現(對於OpenJDK運行時)。

+0

感謝您的回答。 wildcard.c中的實現很好並且易於遵循。 –

+0

通配符擴展是Java 7中的一個標準嗎? –

+0

不,通配符擴展甚至可能不會成爲標準。我懷疑它會在不久的將來,因爲它需要指定JVM進程從命令行接收的所有參數。 –

0

嘗試在URLClassLoader的仰視。你將需要繼承它。

下面是我的自定義類加載器的示例。

/** A <code>ClassLoader</code> that locates runtime & support libraries **/ 
final class MyClassLoader extends URLClassLoader { 
    MyClassLoader(String libStr, ClassLoader parent) throws MalformedURLException { 
     this(new File(libStr), parent); 
    } 

    MyClassLoader(File libDir, ClassLoader parent) throws MalformedURLException { 
     super(new URL[]{libDir.toURI().toURL()}, parent); 
    } 

    final private String[] accepted_lib_extensions = {".jar", ".zip", ".properties"}; 

    void addDir(File dir) throws MalformedURLException { 
     FilenameFilter filenamefilter = new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       String smallName = name.toLowerCase(); 
       for (int i = 0; i < accepted_lib_extensions.length; i++) { 
        if (smallName.endsWith(accepted_lib_extensions[i])){ 
         return true; 
        } 
       } 
       return false; 
      } 
     }; 
     File[] jars = dir.listFiles(filenamefilter); 
     if (jars == null) return; 
     for (int i = jars.length-1; i >= 0; i--) { 
      if (jars[i].isFile()) { 
       final URL url = jars[i].toURI().toURL(); 

       // This is key in adding your own classpath to JRE 
       addURL(url); 
      } 
     } 
    } 
} 
+0

感謝您的回答。但我試過了,我根本無法管理一些東西。首選更多字符串相關的實現。 –

1

AFAIK沒有。

雖然您需要拆分類路徑,然後過濾通配列表以放棄具有錯誤後綴的任何文件,但您可以使用Apache commons FilenameUtils中的文件名通配符方法之一很容易地完成此操作。


FWIW:Java 7中的NIO擴展包括對文件名通配符的支持。

+0

感謝您的回答。通配符擴展是Java 7中的一個標準嗎? –

+0

我會檢查Apache公共實現。 –

+0

@Carlos - 閱讀我答案的最後一句話。 –