Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.class文件目录结构是否与源文件相同?_Java_Jar_Build_.class File - Fatal编程技术网

java.class文件目录结构是否与源文件相同?

java.class文件目录结构是否与源文件相同?,java,jar,build,.class-file,Java,Jar,Build,.class File,目前,我使用以下步骤从src文件到jar执行一些runitime编译: 第一:在目录和子目录中生成源文件 /main /submain1 /submain2 第二:编译代码(目前所有的.class文件都进入这个目录) 第三:将jar从.class文件生成到目标文件夹中 /target 编译由Java工具提供者Java编译器完成 ArrayList<File> files1 = getSourceFiles(); Iterable<? extends J

目前,我使用以下步骤从src文件到jar执行一些runitime编译:

第一:在目录和子目录中生成源文件

/main    
  /submain1
  /submain2 
第二:编译代码(目前所有的.class文件都进入这个目录)

第三:将jar从.class文件生成到目标文件夹中

 /target
编译由Java工具提供者Java编译器完成

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();
ArrayList files1=getSourceFiles();

IterableJava希望
foo.bar.MyClass
位于
foo/bar/MyClass.class
(还有一些与类路径相关的附加要求),否则您将在wazoo上获得
ClassNotFoundExceptions
(或者是
NoClassDefFoundErrors

因此,不仅应该有相同的结构,而且必须有相同的结构。我不知道您为什么要这样编译,而不是使用现有的生成工具,默认情况下,该工具将生成正确的结果

创建一个jar文件相当于创建一个zip文件,所以正如成功的编译并不意味着程序可以工作一样,拥有一个jar文件也不意味着它可以工作

现在我的第一个问题是,将所有.class文件分离到不同的编译单元中,并重建与源文件相同的目录结构是否更好

.class文件的输出结构必须镜像源文件中使用的包名。源文件的AFAIK文件夹结构并没有那个么重要

如果在.jar文件中使用任何其他结构,则类装入器无法找到类


所以你的问题的答案是否定的。

我很惊讶你竟然没有同样的结构就让它工作了(如果你让它工作的话)。你吓坏了我。。。然而,jar创建成功。但测试并不困难,因为一些必需的组件还没有实现。在运行时编译java代码是必要的。因此,我们选择以编程方式使用jdk提供的JavaCompiler。如果你有其他(更好的)建议,我对任何建议都持开放态度。啊,我不知道你是在运行时这样做的。也可以在java上下文之外执行命令行或外部工具进行编译,但我更愿意留在java上下文中,如果您使用自定义类加载器,您可以对类文件执行任何操作。@sby除了…任何操作之外,您还指什么?
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();