2015-10-26 24 views
0

我有一個prorgam這就是產生源代碼和想要的Java的運行期執行期間等來編譯此源代碼:HOWTO正確添加編譯的類文件與封裝結構罐子

generateSource() 
compileSource() 

我使用JavaCompiler進行從ToolProvider :

ArrayList<String> optionList = new ArrayList<String>(); 
System.out.println("Retrieve dependendcy Jars"); 
ArrayList<File> jarfiles = getJarFiles(this.libdir); 
String libpath = System.getProperty("java.class.path") + convertJarFilesToClassPath(jarfiles); 
optionList.addAll(Arrays.asList("-d", this.genClassDir)); 
optionList.addAll(Arrays.asList("-classpath", libpath)); 

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

現在重要的一行是我在選項列表中添加-d classdirectory的位置。

我有這個genClassDir/gen /類,其中我所有的.class文件都包括在內的子目錄。

現在我的jar文件中的問題是,類文件在包結構之前有genClassDir作爲前綴。

./gen/classes/foo/ 
./gen/classes/foo/bar/ 

代替

/foo 
/foo/bar 

或不帶斜線。

我從How to use JarOutputStream to create a JAR file?

第一個答案包裝罐子就像是有辦法我只得到了類文件的封裝結構,我的罐子?

回答

0

你可以創建Jarentry

private void add(File source, String basePath, JarOutputStream target) throws IOException 
{ 
    //... 
    name = name.replaceFirst(basePath, ""); 
    JarEntry entry = new JarEntry(name); 
    //... 
} 

必要時,調整替換之前一個basePath參數添加到在其它問題中所示的add() -method溶液,並且所述條帶從各自的文件名的基本路徑(前/後斜線,反斜線而不是斜線等)

用法:

add(new File("gen/classes/test.class", "gen/classes", new JarOutputStream(...)); 
+0

我在想這個,但是那麼JarEntries仍然會被發現? – Gobliins

+0

我不知道,說實話,我無法測試它。也許你應該嘗試一下,然後看看它在哪裏? – Soana

+0

確定它仍然在編譯,當我設法運行所有依賴我可以接受這個答案 – Gobliins