Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Biên dịch 1 file java bên trong 1 chương trình java

Đôi khi vì yêu cầu của chương trình muốn ta sinh các đoạn code động và sau đó muốn ta biên dịch đoạn code này ngay trong chương trình của chúng ta. Nếu điều ấy xảy ra thì thật là gay go nhỉ!

Nhưng không sao cả. Java JDK cho phép chúng ta làm được công việc đó bằng cách dùng đối tượng javax.tools.JavaCompiler. Lúc này chúng ta có thể biên dịch bất kỳ 1 file nào đó 1 cách hoàn toàn theo ý muốn.

Nhưng bạn phải chú ý 1 điều rằng bạn phải dùng tool java của JDK để chạy chứ không phải tool java của JRE.

1. Biên dịch 1 file:


package vovanhai.wordpress.com;
import java.io.IOException;

import javax.tools.JavaCompiler;

import javax.tools.ToolProvider;

public class CompileOneFile {

public static void main(String args[]) throws IOException {

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

if(compiler==null) {

System.out.println(“Làm ơn chỉ định java tool của JDK”);

return;

}

int results = compiler.run(null, null, null, “c:/Test.java”);

if(results==0)

System.out.println(“Successfully” );

else

System.out.println(“Compile fail…”);

}

}

2.Biên dịch nhiều file


package vovanhai.wordpress.com;

import java.io.File;

import java.io.IOException;

import java.nio.charset.Charset;

import java.util.ArrayList;

import java.util.List;

import javax.tools.DiagnosticCollector;

import javax.tools.JavaCompiler;

import javax.tools.JavaFileObject;

import javax.tools.StandardJavaFileManager;

import javax.tools.ToolProvider;

import javax.tools.JavaCompiler.CompilationTask;

public class CompileMultiFiles {

public static void main (String[] args) {

try {

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

if(compiler==null) {

System.out.println(“Làm ơn chỉ định java tool của JDK”);

return;

}

DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

StandardJavaFileManager fileManager =

compiler.getStandardFileManager(diagnostics, null, Charset.defaultCharset());

//danh sách các file cần biên dịch

List<File> sourceFileList = new ArrayList <File> ();

sourceFileList.add (new File (“c:/Goo.java”));

sourceFileList.add (new File (“c:/Test.java”));

Iterable<? extends JavaFileObject> compilationUnits

=fileManager.getJavaFileObjectsFromFiles (sourceFileList);

CompilationTask task = compiler.getTask (null,fileManager, null, null, null, compilationUnits);

boolean result = task.call();

if (result) {

System.out.println (“Compilation was successful”);

} else {

System.out.println (“Compilation failed”);

}

fileManager.close ();

} catch (IOException e) {

}

}

}

3.Biên dịch file trong bộ nhớ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: