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
分享到:
相关推荐
Java源文件在线编辑, 并编译运行, 输出运行结果示例
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...
编译Java源文件。在命令行中输入以下命令: bash javac Calculator.java 这将生成一个名为Calculator.class的字节码文件。 运行编译后的程序。在命令行中输入以下命令: bash java Calculator 程序会提示你输入两...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 ...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 ...
一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 ...
公开演示作者的代码示例并供学习。 我们相信它不会被用于违反学术诚信政策。 顾名思义,在包含的软件包中,有4个.java类和一个makefile ,用于玩“连接四号”游戏。 跑步 为了您(和我们)的方便,有一个包含的...
生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手...
编译源文件! 这是 Java 的 JNI 的示例存储库。 这些代码是用 C++ 和 Java 编写的,正确展示了通过javah和javac等工具与 JNI 交互的正确方式。 或者,CMakeLists.txt 利用 CMake 编译 C++ 库和 JNI 实现,而 ...
运行Python脚本gencode.py将mushroom.model gencode.py编译为Java源文件的集合。 集合将保存到名为model/的目录中。 现在,在model/目录中运行mvn package 。 运行javac -cp model/target/model-1.0-SNAPSHOT.jar...
生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手...
我们都知道Java源文件,通过编译器,能够产生相应的.class文件,也就是字节码文件,而字节码文件有通过Java虚拟机中的解释器,编译成特定机器上的机器码。 也就是如下: ①Java源文件—>编译器—>字节码文件 ...
这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信每一个Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,...
使用正确的类路径编译Java源文件,即: javac -classpath。:classes:/ opt / pi4j / lib /'*'-d。 TestClasses.java(在目录:/ home / anon / workspace / javaDev中) 使用以下命令执行类文件: 须藤java -...
类转成java源码类解析器 该工具可用于通过解析Java源代码来生成类图。...该文件将在存在Java源文件的同一文件夹中创建。 示例:java -jar umlparser.jar E:\ SJSU \ SEM1 \ 202-SSE \ PP \ srcFolder
包含所有.java源文件的文件夹的完整路径。 该程序仅选择.java文件,而忽略其他文件。 例如-“ C:\ Users \ uml-generator-java \ Test Classes \ class-diagram-test-1” 输出文件名 一字串 输出png文件的文件名。 ...
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 字节...