2010-05-03 27 views
2

是否可以將包含java源代碼的文件夾添加爲類路徑元素。我已經嘗試了一些東西,似乎classloadr沒有拿起java soruce文件?我的一個嘗試如下所示......在運行時將包含Java源代碼的文件夾添加到類路徑中

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()); 
+0

的Java **源文件**不屬於在類路徑上。 classpath是JVM查找** class **文件(編譯後的源代碼)的目錄和JAR文件的集合。 – Jesper 2010-05-03 07:49:10

回答

2

我已經找到了解決我的問題......我用下面的髒「黑客」添加文件夾到類路徑...

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()); 
     } 
    } 
} 
+0

我還添加了一個github,用於使用github的人克隆。並且,希望可以輕鬆解決同樣的問題... git://gist.github.com/387972.git – markovuksanovic 2010-05-03 11:02:47

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

希望幫助!

+0

好的,但是如果我將文件夾添加爲java -cp參數,則甚至可以掃描.java文件。如果我使用URLClassloader它似乎跳過java文件... – markovuksanovic 2010-05-03 09:08:46

+0

嗯..我懷疑你會得到那個工作。除非你挖出類路徑並以編程方式自己掃描它,否則我認爲JVM會忽略類路徑中的java文件。 – aioobe 2010-05-03 09:13:15

1

Java源代碼不是JVM自己可以處理的東西。只有編譯的類文件可以由類加載器加載。所以你只能將JAR文件或CLASS文件的內容添加到類路徑中。

相關問題