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