`
chenyy2050
  • 浏览: 12459 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

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 chen.ya.yuan@163.com
 * @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 chen.ya.yuan@163.com
 * @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

1
1
分享到:
评论
1 楼 blacklab 2011-08-02  
                      

相关推荐

    Java在线编辑编译运行示例

    Java源文件在线编辑, 并编译运行, 输出运行结果示例

    JAVA上百实例源码以及开源项目源代码

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    一个稍微复杂的Java程序示例 这个程序会计算并输出用户输入的两个整数的和与乘积

    编译Java源文件。在命令行中输入以下命令: bash javac Calculator.java 这将生成一个名为Calculator.class的字节码文件。 运行编译后的程序。在命令行中输入以下命令: bash java Calculator 程序会提示你输入两...

    java源码包---java 源码 大量 实例

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一...

    JAVA上百实例源码以及开源项目

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    java源码包4

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 ...

    java源码包3

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 ...

    java源码包2

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 ...

    JAVA源码文本-connect-four:包括用于Java的基于文本的ConnectFour游戏的.java源文件

    公开演示作者的代码示例并供学习。 我们相信它不会被用于违反学术诚信政策。 顾名思义,在包含的软件包中,有4个.java类和一个makefile ,用于玩“连接四号”游戏。 跑步 为了您(和我们)的方便,有一个包含的...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手...

    java写dll接口源码-JNI-By-Examples::sparkler:有趣的JavaJNI示例-使用CMake和C++(当然也可以是C!):double_exclamation_mark:接受PR

    编译源文件! 这是 Java 的 JNI 的示例存储库。 这些代码是用 C++ 和 Java 编写的,正确展示了通过javah和javac等工具与 JNI 交互的正确方式。 或者,CMakeLists.txt 利用 CMake 编译 C++ 库和 JNI 实现,而 ...

    treelite-java-example

    运行Python脚本gencode.py将mushroom.model gencode.py编译为Java源文件的集合。 集合将保存到名为model/的目录中。 现在,在model/目录中运行mvn package 。 运行javac -cp model/target/model-1.0-SNAPSHOT.jar...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手...

    java7hashmap源码-java-skill:JavaSkill,Java技能

    ​ 我们都知道Java源文件,通过编译器,能够产生相应的.class文件,也就是字节码文件,而字节码文件有通过Java虚拟机中的解释器,编译成特定机器上的机器码。 也就是如下: ​ ①Java源文件—&gt;编译器—&gt;字节码文件 ...

    java 混淆工具,不可逆 jocky 也许是最好的了

    这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,...

    MosquittoPI_NX:心爱的PI上MosquittoHelper的简单示例类和实现

    使用正确的类路径编译Java源文件,即: javac -classpath。:classes:/ opt / pi4j / lib /'*'-d。 TestClasses.java(在目录:/ home / anon / workspace / javaDev中) 使用以下命令执行类文件: 须藤java -...

    class转成java源码-Java-UML-Parser:解析器,将Java源代码转换为UML类图

    类转成java源码类解析器 该工具可用于通过解析Java源代码来生成类图。...该文件将在存在Java源文件的同一文件夹中创建。 示例:java -jar umlparser.jar E:\ SJSU \ SEM1 \ 202-SSE \ PP \ srcFolder

    javauml源码-uml-parser:将Java源代码转换为UML图的解析器

    包含所有.java源文件的文件夹的完整路径。 该程序仅选择.java文件,而忽略其他文件。 例如-“ C:\ Users \ uml-generator-java \ Test Classes \ class-diagram-test-1” 输出文件名 一字串 输出png文件的文件名。 ...

    Java核心技术II(第8版)

    11.2.3 一个示例:动态Java代码生成 11.3 使用注解 11.3.1 一个示例:注解事件处理器 11.4 注解语法 11.5 标准注解 11.5.1 用于编译的注解 11.5.2 用于管理资源的注解 11.5.3 元注解 11.6 源码级注解处理 11.7 字节...

Global site tag (gtag.js) - Google Analytics