Java代码实现动态编译,该怎么处理
Java代码实现动态编译

像这样的,我的代码中会控制生成这样同一个文件夹下面的一系列文件,互相可能有引用关系,我怎么在代码中动态编译这些文件成为.class文件。我用了
Main.compile(new String[] { "-d", classesPath,srcFilePath + "/"+ javaFile.getName() });
Main.compile(new String[] { "-d", classesPath,srcFilePath + "/*"});
这两种在jdk1.5的tomcat中运行都不行,第一个是单个文件编译,这样因为有其他文件引用所以会有错,第二个也不行。
我还用了
Runtime rt = Runtime.getRuntime();
String command = "javac " + webInfPath +"src/" + serviceCode.toLowerCase() + "/" + getPackagePath(serviceCode) +
"/* -d " + classesPath;
rt.exec(command);
这种方法也是不行,我想问这两种方法是不是本质上面是一样的?
打什么个给我支个招?
------解决思路----------------------
你用java自带的工具类JavaCompiler
像这样的,我的代码中会控制生成这样同一个文件夹下面的一系列文件,互相可能有引用关系,我怎么在代码中动态编译这些文件成为.class文件。我用了
Main.compile(new String[] { "-d", classesPath,srcFilePath + "/"+ javaFile.getName() });
Main.compile(new String[] { "-d", classesPath,srcFilePath + "/*"});
这两种在jdk1.5的tomcat中运行都不行,第一个是单个文件编译,这样因为有其他文件引用所以会有错,第二个也不行。
我还用了
Runtime rt = Runtime.getRuntime();
String command = "javac " + webInfPath +"src/" + serviceCode.toLowerCase() + "/" + getPackagePath(serviceCode) +
"/* -d " + classesPath;
rt.exec(command);
这种方法也是不行,我想问这两种方法是不是本质上面是一样的?
打什么个给我支个招?
------解决思路----------------------
你用java自带的工具类JavaCompiler
import java.io.IOException;
import java.util.Arrays;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class Compile {
public static void main(String[] args) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList("YouFileToCompile.java"));
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null,
null, compilationUnits);
boolean success = task.call();
fileManager.close();
}
}