0

我正在寻找用 Java 编译一个应用程序,它由一定数量的包中的不同数量的 java 类组成。在命令行中,我可以切换到包含根包的文件夹并键入:

javac rootpackage/subpackage/*.java

或者

javac rootpackage/*/*.java

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

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

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

是否有可能,如果是这样,有人可以就如何正确编译任意放置的根包提供一些提示。

干杯

理查德

更多信息:

学生有一个文件夹结构:

/home/student/work/java/myproject/

其中包含根包。他们启动应用程序(可能存储在此文件夹中 - 因此没有问题 - 但很可能存储在其他地方),要求他们提供包含根包的文件夹。进入后,学生点击创建 JAR 按钮,编译包中的文件,对新编译的文件运行测试,然后创建 JAR。

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

4

2 回答 2

0

JavaCompiler.getTask() 的最后一个参数是 Iterable<? extends JavaFileObject> 包含要传递给编译器的编译单元。提供的 JavaFileObject 实现之一是 SimpleFileJavaObject ( http://java.sun.com/javase/6/docs/api/javax/tools/SimpleJavaFileObject.html )。这是用 java.net.URI 对象构造的,该对象可以从 File 对象轻松创建。把它们放在一起,做这样的事情:

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);

其中 rootPackageDirFromUser 由用户给出,用户告诉您他们将文件存储在哪里,而 fileNameInRootDir 是该目录中的 java 源文件的名称。如果您事先不知道文件名,则需要遍历 rootPackageDirFromUser 来构造一个列表。

我没有对此进行测试,但这应该会给你一个大致的想法。

于 2010-02-04T02:16:25.720 回答
0

Could you peek at the top of each .java file for the line beginning:

package com.blah.blah.assignment;

i.e. look for the start of the package name and then look for the first directory in your search path beginning com (in this example), and then give this path to the JavaCompiler object, or have I misunderstood your question?

Having just looked at the javax.tools package, why not create a composite wrapper for the javaFilemanager which wraps a ForwardingjavaFileManager which will forward all requests for the methods such as getFileForInput or getJavaFileForInput down to the appropriate starting directory in the student's source directory (as decided by your preliminary bit of parsing of the first .java file to determine the root of their sourcepath)

于 2010-02-03T13:29:17.160 回答