【问题标题】:How to expand Java Classpath Wildcards from code?如何从代码中扩展 Java 类路径通配符?
【发布时间】:2011-07-05 02:31:03
【问题描述】:

我想从代码中扩展 Java 类路径通配符(Java 6 上的新功能)。 Java 标准库中是否有一些我可以使用而不是从头开始编写的代码?

例子:

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

提前致谢

【问题讨论】:

    标签: java classpath wildcard expand


    【解决方案1】:

    Java 标准库中是否有一些我可以使用而不是从头开始编写的代码?

    没有。类路径通配符扩展不是由 Java 中的标准库执行的,甚至在 JVM 加载任何类之前执行扩展。它首先不是一个标准,只有在 JRE 实现支持它时才可用。据我所知,Oracle/Sun 和 OpenJDK 运行时允许类路径通配符扩展。

    很明显,如果您打算在 Java 中执行此操作,则需要推出自己的实现。您可以在位于源代码的jdk/src/share/bin 目录中的wildcard.c 文件中查找C 中的实现(对于OpenJDK 运行时)。

    【讨论】:

    • 感谢您的回答。 wildcard.c 中的实现很好且易于遵循。
    • 通配符扩展是 Java 7 的标准吗?
    • 不,通配符扩展甚至可能不会成为标准。我怀疑它会在不久的将来实现,因为它需要指定 JVM 进程将从命令行接收的所有参数。
    【解决方案2】:

    AFAIK 没有。

    您可以使用 Apache commons FilenameUtils 中的文件名通配符方法之一相当容易地做到这一点,尽管您需要拆分类路径,然后过滤通配符列表以丢弃任何后缀错误的文件。


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

    【讨论】:

    • 感谢您的回答。通配符扩展是 Java 7 中的标准吗?
    • 我会检查一下 Apache commons 的实现。
    【解决方案3】:

    尝试在 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);
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。但我试过了,我根本无法管理一些事情。首选与字符串相关的实现。
    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多