Java 如何使用包结构将已编译的类文件正确添加到jar

Java 如何使用包结构将已编译的类文件正确添加到jar,java,jar,java-compiler-api,javacompiler,Java,Jar,Java Compiler Api,Javacompiler,我有一个生成源代码的prorgam,希望在java运行时执行期间编译此源代码,如: generateSource() compileSource() 我使用ToolProvider提供的Java编译器: ArrayList<String> optionList = new ArrayList<String>(); System.out.println("Retrieve dependendcy Jars"); ArrayList<File> jarfiles

我有一个生成源代码的prorgam,希望在java运行时执行期间编译此源代码,如:

generateSource()
compileSource()
我使用ToolProvider提供的Java编译器:

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();
而不是

/foo
/foo/bar
或者没有前导斜杠

我正在包装这个罐子,就像第一个回答中的那样


有没有办法只获取jar中类文件的包结构?

您可以在另一个问题中显示的解决方案的
add()
-方法中添加
basePath
参数,并在创建
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(...));

我一直在想这个,但到时候还能找到JarEntries吗?老实说,我不知道,我也无法测试它。也许你应该试一下,然后看看,它去哪里了?好吧,它还在编译,当我设法运行所有依赖项时,我可以接受这个答案
add(new File("gen/classes/test.class", "gen/classes", new JarOutputStream(...));