Java源文件编译示例

java程序编译java源文件

 

JavacCompile文件:

 

package yan.demo.javac;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.FileObject;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;


/**
 * 編譯java源文件
 *
 * @author Chen Ya Yuan
 * @Email [email protected]
 * @version V1.0
 */
public class JavacCompile {
    public static void main(String[] args) throws Exception {
      
        compilePackage(
                Conf.readProperties("project.path")+ Conf.readProperties("src.testentity"),
                Conf.readProperties("project.libpath"),
                Conf.readProperties("project.path")+ Conf.readProperties("classes"),
                Conf.readProperties("project.sourcepath"));
    }

    /**
     * 編譯該包及子包的所有類
     * @param fromPath
     *            文件來源
     * @param libPath
     *            項目依賴Jar包來源
     * @param savePath
     *            編譯後class字節碼文件保存路徑
     * @param sourcePath
     *            依賴源碼路徑
     * @throws Exception
     */
    public static void compilePackage(String fromPath, String libPath,
            String savePath,String sourcePath) throws Exception {
        // 要掃描的文件夾
        File file = new File(fromPath);
        // 存儲文件的數據
        ArrayList<File> allFile = ScanDirectory.getFile(file);
        String fromFile = "";

        // 设置编译选项
        Iterable<String> options = getCompileOptions(savePath, libPath, sourcePath);

        for (File f : allFile) {
            if (f.getName().matches(".*\\.java$")) { // 匹配java格式的文件
                fromFile = f.getPath(); // java源文件 文件名
                // 編譯文件
                compilejava(fromFile, options, savePath);
            }
        }
    }

    /**
     * 編譯單個java源文件
     *
     * @param fromFile
     *            java源文件
     * @param libPath
     *            項目依賴Jar包來源
     * @param savePath
     *            編譯後class字節碼文件保存路徑
     * @throws Exception
     */
    public static void compilejava(String fromFile, Iterable<String> options,
            String savePath) throws Exception {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        // 建立DiagnosticCollector對象
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(
                diagnostics, null, null);

        // 设置编译选项
        Iterable option = options;

        // 建立用於保存被編譯文件名的對象
        // 每個文件被保存在一個從JavaFileObject繼承的類中
        Iterable compilationUnits = fileManager
                .getJavaFileObjectsFromStrings(Arrays.asList(fromFile));

        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
                diagnostics, option, null, compilationUnits);
        // 編譯源程序
        boolean success = task.call();
        for(Diagnostic diagnostic :diagnostics.getDiagnostics()){
            System.out.format(//格式化編譯不成功時   輸出的相關信息
                    "Code: %s%n" +
                    "Kind: %s%n" +
                    "Position: %s%n" +
                    "Start Position: %s%n" +
                    "End Position: %s%n" +
                    "Source: %s%n" +
                    "Message:  %s%n",
                    diagnostic.getCode(), diagnostic.getKind(),
                    diagnostic.getPosition(), diagnostic.getStartPosition(),
                    diagnostic.getEndPosition(), diagnostic.getSource(),
                    diagnostic.getMessage(null)
            );
           
        }

        fileManager.close();
        System.out.println((success) ? fromFile + "  編譯成功" : fromFile
                + "  編譯失敗");
    }

    /**
     * 设置编译选项
     *
     * @param savePath
     *            編譯後class字節碼文件保存路徑
     * @param libPath
     *            項目依賴Jar包來源
     * @param sourcePath
     *            依賴源碼路徑
     * @return
     */
    public static Iterable<String> getCompileOptions(String savePath,
            String libPath,String sourcePath) {
        List<String> options = new ArrayList<String>();
        File file = new File(savePath);
        if (!file.exists()) {
            file.mkdirs(); // 路徑不存在時,創建
        }

        // 設置編譯後生成的類文件的輸出目錄
        if (savePath != null) {
            options.add("-d");
            options.add(savePath);
        }

        // 設置用到的第三方類庫的目錄
        if (libPath != null) {
            options.add("-classpath");
            options.add(getLibJar(libPath));
        }
       
        //指定查找輸入源文件的位置
        if(sourcePath!=null){
            options.add("-sourcepath");
            options.add(sourcePath);
        }
       
        //輸出有關編譯器正在執行的操作的信息
//        options.add("-verbose");

//        options.add("-target");
//        options.add("1.6");
       
        return options;
    }

    private static String getLibJar(String libPath) {
        StringBuffer sb = new StringBuffer();
        // 要掃描的文件夾
        File file = new File(libPath);
        // 存儲文件的數據
        ArrayList<File> allFile = ScanDirectory.getFile(file);
        for (File f : allFile) {
            if (f.getName().matches(".*\\.[jJ]+[aA]+[rR]+$")) { // 匹配jar格式的文件
                sb.append(libPath + File.separator + f.getName() + ";"); // 多個jar文件用分號隔開
            }
        }
       
        return sb.substring(0, sb.lastIndexOf(";"));
    }
   
    public JavacCompile(){
       
    }

}

 

 

 

Conf文件:

 

package yan.demo.javac;

import java.io.FileInputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

/**
 *
 * @author Chen Ya Yuan
 * @Email [email protected]
 * @version V1.0
 */
public class Conf {
 // 根据key读取value
    public static String readProperties(String key) {
        Properties props = new Properties();
        try {
            String path = Conf.class.getResource("/").getPath();
            FileInputStream fis =
                new FileInputStream(path+"config/Conf.chenyy.properties");
            props.load(fis);
            String property = props.getProperty(key.trim());
            if(property!=null){
                property=property.trim();
            }
//            System.out.println(key + value);
            return property;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
   
    // 读取properties的全部信息
    public static Map<String,Object> readAllProperties() {
        Properties props = new Properties();
        Map<String,Object> map = new HashMap<String,Object>();
        try {
            FileInputStream fis = new FileInputStream(Conf.class.getResource("/").getPath()+"config/Conf.chenyy.properties");
            props.load(fis);
            Enumeration en = props.propertyNames();
           
            while (en.hasMoreElements()) {
                String key = (String) en.nextElement();
                String property = props.getProperty(key.trim());
                if(property!=null){
                    property=property.trim();
                }
                map.put(key, property);
//                System.out.println(key + "   " + property.trim());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
   
    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<String,Object>();
        map = readAllProperties();
        for(Object object: map.keySet()){ 
            System.out.println("key:"+object+"   value:"+map.get(object));
        }
    }
   
}

 

 

Conf.chenyy.properties文件:


# the project path
project.path = E:/workspace/project/javacdemo
project.libpath = E:/workspace/project/javacdemo/lib

# set search -sourcepath
project.sourcepath = E:/workspace/project/javacdemo/src

#
src.testentity = /src/yan/demo/javac/test

#schema
schema0 = schema000

#schema1
schema1 = schema1111

#schema2
schema2 = schema2222

#
classes = /bin/classes

你可能感兴趣的:(java)