2015-10-26 3 views
0

У меня есть prorgam Thats порождающие исходный код и хотите скомпилировать этот исходный код во время выполнения 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/classes, где все мои файлы .class находятся внутри, включая поддиры.

В настоящее время проблема в моем файле jar заключается в том, что файлы классов имеют genClassDir как префикс перед структурой пакета.

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

вместо

/foo 
/foo/bar 

или без слэш.

Я упаковки банки, как и в первом ответе от How to use JarOutputStream to create a JAR file?

Есть ли способ, я получаю только структуру пакета файлов класса в моем банке?

ответ

0

Вы можете добавить параметр basePath к add() -методу решения, показанным на другом вопросе, и полоску базового путем от имени каждого файла перед созданием Jarentry

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

Отрегулируйте замену по мере необходимости (ведущий/задней косой черты, обратные слэши вместо косой черты и т.д.)

Использование:

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

Я думал об этом , но с этим все еще можно найти JarEntries? – Gobliins

+0

Я не знаю, честно говоря, и я не могу это проверить. Может быть, вам стоит просто попробовать, а потом посмотреть, куда он идет? – Soana

+0

ok все еще компилируется, когда мне удается работать со всеми зависимостями, я могу принять этот ответ – Gobliins