目前我通过以下步骤从src文件到jar进行一些runitime编译:
首先:在目录和子目录中生成源文件
/main
/submain1
/submain2
第二:编译代码(当前所有.class文件都进入此目录)
/builddir
第三步:将.class文件中的jar生成到目标文件夹
/target
编译由Java ToolProviders Javacompiler
完成ArrayList<File> files1 = getSourceFiles();
Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files1);
JavaCompiler.CompilationTask task = compiler.getTask(null ,fileManager , null, optionList, null, compilationUnits1 );
boolean compiled = task.call();
现在我的第一个问题是,将所有.class文件分成不同的编译单元并重建与源文件相同的目录结构会更好吗?
如果是这样,怎么办呢?
答案 0 :(得分:1)
Java期望在foo.bar.MyClass
找到foo/bar/MyClass.class
(带有一些额外的类路径相关要求),否则你会得到ClassNotFoundExceptions
(或者是NoClassDefFoundErrors
)wazoo
因此,您不仅应具有相同的结构,而且必须具有相同的结构。我不知道为什么你这样编译而不是使用现有的构建工具,它会默认生成正确的结果。
创建一个jar文件相当于创建一个zip文件,所以正如一个成功的编译并不意味着你的程序有效,没有一个jar文件意味着它是一个工作的。
答案 1 :(得分:1)
现在我的第一个问题是,将所有.class文件分成不同的编译单元并重建与源文件相同的目录结构会更好吗?
.class文件的输出结构必须镜像源文件中使用的包名称。源文件的AFAIK文件夹结构并不重要。
如果在.jar文件中使用任何其他结构,则类加载器无法找到类。
所以问题的答案是否。