Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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类_Java_Java Compiler Api - Fatal编程技术网

以编程方式编译存储在任意子文件夹中的包中的Java类

以编程方式编译存储在任意子文件夹中的包中的Java类,java,java-compiler-api,Java,Java Compiler Api,我希望用Java编译一个应用程序,它由一定数量的包中的各种Java类组成。在命令行中,我可以更改为包含根包的文件夹,并键入: javac rootpackage/subpackage/*.java 或 编译我的rootpackage的所有主要子包中的所有java类 但是,我希望能够在Java应用程序中实现这一点。(我们的想法是,我们为学生提供一个包含单元测试的应用程序。单元测试需要针对他们的代码运行,然后应用程序创建一个JAR文件,其中包含他们的源文件,这些源文件已经用测试结果“加水印”。所有

我希望用Java编译一个应用程序,它由一定数量的包中的各种Java类组成。在命令行中,我可以更改为包含根包的文件夹,并键入:

javac rootpackage/subpackage/*.java

编译我的rootpackage的所有主要子包中的所有java类

但是,我希望能够在Java应用程序中实现这一点。(我们的想法是,我们为学生提供一个包含单元测试的应用程序。单元测试需要针对他们的代码运行,然后应用程序创建一个JAR文件,其中包含他们的源文件,这些源文件已经用测试结果“加水印”。所有这些都可以正常工作,但我们希望确保测试的类文件是为rom中提交的源文件,因此有了以编程方式编译java源代码的想法)

问题在于每个学生将其根包存储在任意位置,而我似乎无法将文件的位置传递给JavaCompiler(javax.tools)

是否有可能,如果有,是否有人能给出一些关于如何正确编译任意放置的根包的提示

干杯

理查德

更多信息:

学生有一个文件夹结构:

/home/student/work/java/myproject/
其中包含根包。他们启动应用程序(可能存储在这个文件夹中,因此没有问题,但更可能存储在其他地方),请求他们提供包含根包的文件夹。输入后,学生单击createjar按钮,该按钮编译包中的文件,对新编译的文件运行测试,然后创建JAR


在思考这个问题的同时,解决方案可能是告诉学生在包含其根包的文件夹中安装我们的“创建JAR”应用程序。

您能看一下每个.java文件的顶部吗

package com.blah.blah.assignment

i、 e.查找包名的开头,然后查找搜索路径中以com开头的第一个目录(在本例中),然后给出JavaCompiler对象的路径,或者我误解了您的问题


刚刚看了javax.tools包,为什么不为javaFilemanager创建一个复合包装器,它包装一个ForwardingjavaFileManager,它将对getFileForInput或getJavaFileForInput等方法的所有请求转发到学生源目录中相应的起始目录(由您对第一个.java文件的初步分析决定,以确定其源路径的根)

JavaCompiler.getTask()的最后一个参数你能不能让学生自己做jar?…你的工具可以成为他们上传jar并运行测试的工具-这可以减轻你创建jar工具的头疼,并教会他们如何使用jar(我认为这很重要)或者,听起来您心目中的工具将附带某种GUI,因此您可以给他们一个JFileDialog来选择sourcepath。
/home/student/work/java/myproject/
List<JavaFileObject> javaFiles = new ArrayList<JavaFileObject>();
File javaFile = new File(rootPackageDirFromUser, fileNameInRootDir);
URI javaURI = javaFile.toURI();
javaFiles.add(new SimpleJavaFileObject(javaURI, JavaFileObject.Kind.SOURCE));
JavaCompiler.CompilationTask task =
    ToolProvider.getSystemJavaCompiler().getTask(..., javaFiles);