Как расширить Java подстановочные знаки Classpath из кода? - PullRequest
1 голос
/ 05 июля 2011

Я бы хотел расширить подстановочные знаки Java classpath (Новое в Java 6) из кода.Есть ли какой-нибудь код в Java Standard Lib, который я мог бы использовать вместо того, чтобы делать это с нуля?

Пример:

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

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 05 июля 2011

AFAIK нет.

Вероятно, вы могли бы сделать это довольно легко, используя один из подстановочных знаков имени файла в Apache Commons FilenameUtils, хотя вам нужно разделить путь к классам, а затем отфильтровать список подстановочных знаков, чтобы удалить любые файлы с неправильным суффиксом.


FWIW: расширения NIO в Java 7 включают поддержку подстановочных знаков в именах файлов.

1 голос
/ 05 июля 2011

Есть ли какой-нибудь код в Java Standard Lib, который я мог бы использовать вместо того, чтобы делать это с нуля?

Нет.Расширение подстановочного знака Classpath не выполняется стандартной библиотекой в ​​Java, и расширение выполняется даже до того, как JVM загрузит какие-либо классы.Во-первых, это не стандарт, и он доступен только в том случае, если его поддерживает реализация JRE.Насколько я знаю, среды выполнения Oracle / Sun и OpenJDK допускают расширение подстановочного знака classpath.

Совершенно очевидно, что вам потребуется развернуть собственную реализацию, если вы собираетесь делать это в Java.Вы можете найти реализацию в C (для среды выполнения OpenJDK) в файле wildcard.c, расположенном в каталоге jdk/src/share/bin источников.

0 голосов
/ 05 июля 2011

Попробуйте поискать на 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);
            }
        }
    }
}
...