java编译源文件_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 allFile = ScanDirectory.getFile(file);

String fromFile = "";

// 设置编译选项

Iterable 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 options,

String savePath) throws Exception {

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

// 建立DiagnosticCollector對象

DiagnosticCollector diagnostics = new DiagnosticCollector();

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 getCompileOptions(String savePath,

String libPath,String sourcePath) {

List options = new ArrayList();

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 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 readAllProperties() {

Properties props = new Properties();

Map map = new HashMap();

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 map = new HashMap();

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这么奇葩搞笑的代码注释你见过吗

程序员作为一种“异类”,虽然他们平时给人们的留下的印象并不太好,觉得他们只会写代码。但是有的时候不得不佩服他们天马行空的想象力,他们可能会利用注释让你噗嗤一笑,下面我们来看看那些奇葩搞笑的代码注释吧。注释1&#xff1a…

facelets_不要在facelets中重复表情

facelets您是否曾经在JSF中看到过像这样的重复EL表达式&#xff1f; <h:inputText value"#{oneBean.name}" rendered"#{anotherBean.showPerson}"/> <h:inputText value"#{oneBean.birthday}" rendered"#{anotherBean.showPerson…

C语言与Java的深情对话:儿子,还得多练几年啊!老子还是老子

很多小伙伴都老是会碰到疑问&#xff0c;其实还是基础没打扎实&#xff0c;这些题如果你不看答案你能知道多少呢&#xff1f;如果还有很多不知道就证明基础没打扎实&#xff0c;如果你还在入门纠结&#xff0c;如果你还在苦恼怎么入门&#xff01;小编有个建议&#xff0c;可以…

Servlet和JSP之间的区别

JSP和Servlet都是与使用Java构建基于Web的应用程序有关的重要概念。 基本上&#xff0c;Servlet是Java中HTML&#xff0c;而JSP是HTML中的Java。 任何典型的Web开发面试都可能有几个基于JSP和Servlet的Java面试问题 。 尽管JSP和Servlet的主要目的是相同的&#xff0c;但是两者…

BAT人脸识别功能第二步-人脸检测

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

java emptylist_Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方...

先说明一下好处有哪些&#xff1a;1&#xff0c;如果你想 new 一个空的 List &#xff0c;而这个 List 以后也不会再添加元素&#xff0c;那么就用 Collections.emptyList() 好了。new ArrayList() 或者 new LinkedList() 在创建的时候有会有初始大小&#xff0c;多少会占用一内…

java中插入排序实例_java中对插入排序的理解以及实例

一、基本思想通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应的位置并插入。插入排序非常类似于整扑克牌。在开始摸牌时&#xff0c;左手是空的&#xff0c;牌面朝下放在桌上。接着&#xff0c;一次从桌上摸起一张牌&a…

hazelcast入门教程_Hazelcast入门指南第3部分

hazelcast入门教程这是从初学者的角度来看一系列有关如何使用Hazelcast的文章的延续。 如果您还没有阅读最后两个&#xff0c;我鼓励阅读它们&#xff1a; Hazelcast入门指南第1部分 Hazelcast入门指南第2部分 原始人来了 在上一篇文章中&#xff0c;我提到将ILock与IList和…

经典游戏底层框架--迷宫游戏构成原理剖析

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

突破100万年薪《多线程服务器端架构》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

Java中的观察者设计模式

在本教程中&#xff0c;我们将讨论Observer设计模式。 观察者模式有两个主要方面- 主题和观察者 。 当我们的系统有多个对象&#xff08;称为观察者&#xff09;时 &#xff0c;将使用一个模式&#xff0c;该对象依赖于一个特定对象&#xff08; 主体&#xff09;的状态 。 所…

java class api 中文乱码_SpringMVC之springmvc原始api,请求中文乱码问题

先搞一波效果图1.Controllerpackage com.tz.controller;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.springframework.beans.factory.annotation.Required;import org.springframe…

从流水线工人,到谷歌上班的程序媛

非科班、转行当程序员的励志故事有很多&#xff0c;我们在 8 年前扩散分享过一个国外的故事&#xff1a;我来自于一个东欧国家。我在一个煤矿里工作了很多年&#xff08;在一个很深的矿井里&#xff09;。每天我都处在危险中&#xff0c;那些年都是这样度过的。后来我感觉过够了…

jpa 实体映射视图_JPA教程:实体映射-第2部分

jpa 实体映射视图在上一篇文章中&#xff0c;我展示了一种持久保存实体的简单方法。 我解释了JPA用于确定实体默认表的默认方法。 假设我们要覆盖此默认名称。 我们之所以喜欢这样做&#xff0c;是因为数据模型是以前设计和修复的&#xff0c;并且表名与我们的类名不匹配&#…

java顺序栈和链栈_Java的顺序栈和链式栈

栈的定义栈是限制在表的一段进行插入和删除的运算的线性表&#xff0c;通常能够将插入、删除的一端为栈顶&#xff0c;例外一端称为栈底&#xff0c;当表中没有任何元素的时候称为空栈。通常删除(又称“退栈”)叫做弹出pop操作&#xff0c;每次删除的都是栈顶最新的元素&#x…

Java:ChronicleMap第2部分,超级RAM映射

诸如无处不在的HashMap类的标准Java Map最终受到可用RAM的限制。 阅读本文并了解如何创建几乎无限大小甚至超过目标计算机的RAM大小的Java Map。 内置的Map实现&#xff0c;例如HashMap和ConcurrentHashMap &#xff0c;只要它们相对较小&#xff0c;就可以正常工作。 在所有情…

jsp中的java部分_jsp页面的七个组成部分

jsp页面的七个组成部分1. 静态内容&#xff1a;前端内容一行一行翻译成 out.write(“前端内容”);2. 指令&#xff1a; 第一个指令是pagepage指令的第一个标准用法&#xff0c;告诉servlet容器&#xff0c;这是一个jsp页面pageEncoding 指…

java多线程做一件事_关于Java的十件事

java多线程做一件事那么&#xff0c;您从一开始就一直在使用Java&#xff1f; 还记得那些被称为“ Oak”的日子&#xff0c;OO仍然是热门话题&#xff0c;C 人士认为Java没有机会&#xff0c;Applet还是一件事吗&#xff1f; 我敢打赌&#xff0c;您至少不了解以下一半内容。 …

java第二章复习_JAVA第二章知识点

JAVA第二章知识点本章知识梳理2.1 关键字2.2 标识符2.3 变 量2.4运算符2.5 程序流程控制2.6 方法2.1 关键字关键字(keyword)的定义和特点定义&#xff1a;被java语言赋予了特殊含义&#xff0c;用做专门用途的字符串(单词)特点&#xff1a;关键字中所有字母都为小写保留字(rese…

打造大型直播平台之《PC客户端架构》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。