2015-10-21 59 views
0

目前我做的一個src文件中的一些runitime編譯到一個罐子以下步驟:java.class文件目錄結構與源文件相同嗎?

第一:產生一個目錄源文件及子目錄

/main  
    /submain1 
    /submain2 

二:編譯代碼(目前所有的.class文件進入這個目錄)

/builddir 

三:從生成.class文件的jar到目標文件夾

編譯是由Java的ToolProviders通過JavaCompiler進行

ArrayList<File> files1 = getSourceFiles(); 
Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files1); 
JavaCompiler.CompilationTask task = compiler.getTask(null ,fileManager , null, optionList, null, compilationUnits1); 
boolean compiled = task.call(); 

現在我的第一個問題是,會是更好地應對所有的.class文件分成不同的編譯單元和重建相同的目錄結構與源文件有哪些?

如果是這樣,怎麼能做到呢?

+0

我很驚訝你得到它的工作(如果你得到它的工作)*不具有相同的結構*。 – Kayaman

+0

你嚇到我了......但是這個jar被成功創建了。但它沒有經過嚴格測試,因爲一些必需的組件尚未實現。 – Gobliins

回答

1

的Java預計foo.bar.MyClassfoo/bar/MyClass.class發現(有一些額外的類路徑相關的要求),否則你將得到ClassNotFoundExceptions(或者是NoClassDefFoundErrors)了wazoo。

所以你不僅應該有相同的結構,你必須必須具有相同的結構。我不知道爲什麼要編譯這樣的代碼,而不是使用默認生成正確結果的現有構建工具。

創建一個jar文件相當於創建一個zip文件,所以只是作爲一個成功的編譯並不意味着你的程序工作,既不會有一個jar文件意味着這將是一個正在運行的。

+0

在運行時需要編譯java代碼。所以我們的選擇是以編程方式使用由jdk提供的JavaCompiler。如果您有其他(更好的)建議,我願意提供任何建議。 – Gobliins

+0

啊,我沒有意識到你是在運行時這樣做的。 – Kayaman

+0

它也可以執行命令行或外部工具的Java上下文編譯,但我最好留在Java上下文 – Gobliins

1

現在我的第一個問題是,將所有.class文件分隔成不同的編譯單元並重建與源文件相同的目錄結構會更好嗎?

.class文件的輸出結構必須反映在源文件中使用的包名。源文件的AFAIK文件夾結構並不重要。

如果你用你的.jar文件的任何其他結構,類不能被類加載器找到。

所以回答你的問題是沒有

相關問題