2011-07-05 5 views

답변

1

Java Standard Lib에 처음부터 다시 사용할 수있는 코드가 있습니까?

아니요. 클래스 경로 와일드 카드 확장은 Java의 표준 라이브러리에서 수행하지 않으며 확장은 JVM에서 클래스를로드하기 전에 수행됩니다. 최초의 표준은 아니고 JRE 구현이 지원하는 경우에만 사용할 수 있습니다. 내가 아는 한 Oracle/Sun 및 OpenJDK 런타임은 classpath 와일드 카드 확장을 허용합니다.

Java에서이 작업을 수행하려면 자체 구현을 롤백해야합니다. 소스의 jdk/src/share/bin 디렉토리에있는 wildcard.c 파일의 C (OpenJDK 런타임 용)에서 구현을 찾을 수 있습니다.

+0

답변 해 주셔서 감사합니다. wildcard.c의 구현은 훌륭하고 쉽게 따라 할 수 있습니다. –

+0

Java 7에서 와일드 카드 확장이 표준입니까? –

+0

아니요, 와일드 카드 확장이 표준이되지 않을 수도 있습니다. 가까운 장래에 JVM 프로세스가 명령 줄에서받는 모든 인수를 지정해야하므로 의심 할 여지가 없습니다. –

0

에서

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); 
    } 

덕분에 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 없습니다.

아파치 commons FilenameUtils에서 파일 이름 와일드 카드 방법 중 하나를 사용하면 상당히 쉽게 할 수 있습니다. classpath를 분할 한 다음 와일드 카드 목록을 필터링하여 잘못된 접미사가있는 파일을 삭제해야합니다.


FWIW는 : 자바 7의 NIO 확장 파일 이름 와일드 카드에 대한 지원이 포함되어 있습니다.

+0

답변 해 주셔서 감사합니다. 와일드 카드 확장은 Java 7에서 표준입니까? –

+0

Apache commons 구현을 점검 할 것입니다. –

+0

@ 카를로스 - 내 대답의 마지막 문장을 읽으십시오. –

관련 문제