在运行时将包含java源的文件夹添加到类路径

时间:2010-05-03 06:59:44

标签: java reflection classpath

是否可以添加包含java源代码的文件夹作为classpath元素。我尝试了一些东西,似乎classloadr没有拿起java soruce文件?我的一次尝试如下所示......

File uncompressedSrc = new File("uncompressed" + File.separator + "src" + File.separator);
URL uncompressedSrcURL = null;
try {
    uncompressedSrcURL = new URL("file://"
        + uncompressedSrc.getAbsolutePath());
} catch (MalformedURLException e) {
    e.printStackTrace();
}
URL elements[] = { uncompressedSrcURL };
new URLClassLoader(elements, ClassLoader.getSystemClassLoader());

3 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法......我使用以下脏“hack”将类文件夹添加到类路径...

public static void addUrl(URL u) {
    URLClassLoader sysloader = (URLClassLoader) ClassLoader
            .getSystemClassLoader();
    Class<URLClassLoader> sysclass = URLClassLoader.class;

    try {
        Method method = sysclass.getDeclaredMethod("addURL", parameters);
        method.setAccessible(true);
        method.invoke(sysloader, new Object[] { u });
    } catch (Throwable t) {
        t.printStackTrace();
        try {
            throw new IOException(
                    "Error, could not add URL to system classloader");
        } catch (IOException e) {
            logger.log(Level.SEVERE, e.getMessage());
        }
    }
}

答案 1 :(得分:1)

对不起。我通过你的问题方式快速浏览了一下。

正如@Daniel所说,JVM无法读取.java个文件,只能读取.class个文件。

java文件可以编译成类文件,并以编程方式加载到JVM中,如下所述:Programmatically Compile and Execute with Java

关键因素如下

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager filemanager = compiler.getStandardFileManager( null, null, null );

try {
    Iterable compilationUnits = filemanager.getJavaFileObjects( file );
    compiler.getTask( null, filemanager, null, null, null, compilationUnits ).call();

    filemanager.close();
} catch ( IOException e ) {
    e.printStackTrace();
}

希望有所帮助!

答案 2 :(得分:1)

Java源代码本身并不是JVM可以处理的。类加载器只能加载已编译的类文件。因此,您只能将JAR文件或CLASS文件的内容添加到类路径中。