我有一个prorgam生成源代码,并希望在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 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?
的第一个答案中打包罐子有没有办法在jar中只得到类文件的包结构?
答案 0 :(得分: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(...));