1

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

generateSource()
compileSource()

我使用来自 ToolProvider 的 JavaCompiler:

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 类目录的位置。

我有这个 genClassDir /gen/classes 我所有的 .class 文件都在里面,包括子目录。

现在我的 jar 文件中的问题是,类文件在包结构之前有 genClassDir 作为前缀。

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

代替

/foo
/foo/bar

或没有前导斜杠。

我正在像如何使用 JarOutputStream 创建 JAR 文件的第一个答案一样打包 jar?

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

4

1 回答 1

0

您可以在另一个问题中显示的解决方案的 -method 中添加一个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(...));
于 2015-10-26T15:31:42.117 回答