一、获得批量源文件
完整源代码
package compile;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
//操作查找文件的类
public class TextSearchFile {
static int countFiles = 0;// 声明统计文件个数的变量
static int countFolders = 0;// 声明统计文件夹的变量
static String error;
public static File[] searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件
File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
@Override
public boolean accept(File pathname) {// 实现FileFilter类的accept方法
if (pathname.isFile())// 如果是文件
countFiles++;
else
// 如果是目录
countFolders++;
if (pathname.isDirectory()
|| (pathname.isFile() && pathname.getName().toLowerCase().contains(keyWord.toLowerCase())))// 目录或文件包含关键字
return true;
return false;
}
});
List<File> result = new ArrayList<File>();// 声明一个集合
for (int i = 0; i < subFolders.length; i++) {// 循环显示文件夹或文件
if (subFolders[i].isFile()) {// 如果是文件则将文件添加到结果列表中
result.add(subFolders[i]);
} else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
File[] foldResult = searchFile(subFolders[i], keyWord);
for (int j = 0; j < foldResult.length; j++) {// 循环显示文件
result.add(foldResult[j]);// 文件保存到集合中
}
}
}
File files[] = new File[result.size()];// 声明文件数组,长度为集合的长度
result.toArray(files);// 集合数组化
return files;
}
public static String[] search_java_file() {
System.out.print("请输入java项目路径:");
Scanner input=new Scanner(System.in);
String file_path=input.next();
File folder = new File(file_path);// 默认目录
String keyword = ".java";
if (!folder.exists()) {// 如果文件夹不存在
System.out.println("目录不存在:" + folder.getAbsolutePath());
return null;
}
File[] result = searchFile(folder, keyword);// 调用方法获得文件数组
if(result.length == 0) {
System.out.println("在 " + folder + " 以及所有子文件时查找对象" + keyword);
System.out.println("查找了" + countFiles + " 个文件," + countFolders + " 个文件夹,共找到 " + result.length + " 个符合条件的文件");
}
String src [] = new String[result.length];
for (int i = 0; i < result.length; i++) {// 循环显示文件
File file = result[i];
src[i] = new String(file.getAbsolutePath());//将文件绝对路径转换为字符串并保存
// System.out.println(src[i]);// 显示文件绝对路径
}
return src;
}
public static void main(String[] args) {// java程序的主入口处
error = CompileMain.compile(TextSearchFile.search_java_file());
}
}
二、编译批量源代码
1.关键的编译函数
int result = compiler.run(null, null, error, src);
//函数参数
int run(InputStream in, OutputStream out, OutputStream err, String... arguments);
这个函数有四个参数:
第一个参数:为java编译器提供参数
第二个参数:得到java编译器的输出信息
第三个参数:接收编译器的错误信息
第四个参数:可变参数(是一个String数组)能传入一个或多个Java源文件
返回值:0扁食编译成功,非0表示编译失败
2.完整源代码
package compile;
//CompileMain.java
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class CompileMain {
public static String compile(String []src) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
ByteArrayOutputStream error = new ByteArrayOutputStream();
int result = compiler.run(null, null, error, src);
System.out.println(result == 0 ? "编译成功" : "编译失败");
String error_result =new String(error.toByteArray());
if(!error_result.equals(null)) {
System.out.println(error_result);
return error_result;
}
System.out.println("是否删除编译成功后的.class文件?(Y/N)");
Scanner input=new Scanner(System.in);
String answer=input.next();
if(answer.equals("Y")||answer.equals("y")) {
//编译成功,看是否删除.class文件
for(int i = 0;i<src.length;i++) {
String file_name = src[i].substring(0, src[i].length()-5);
String class_path = file_name + ".class";
File file_class = new File(class_path);
file_class.delete();
}
}
return "0错误";
}
public static void main(String[] args) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
String src [] = {"C:\\Users\\lenovo\\Desktop\\Test.java"};
CompileMain.compile(src);
}
}
3.遇到的问题
可能会出现报错如下:
Exception in thread "main" java.lang.NullPointerException
报这个错的原因是编译所需的tools.jar并不在jre中,而是在jdk安装目录下,因此需要将jre改成jdk
4.解决的方式
打开对应项目的properties,选择Java Build Path
点击JRE,然后点击Edit
点击Installed JREs ,然后点击Add,Next
点击Directory,选择jdk导入,然后回到前面选择之前导入的jdk就可以了
三、python调用jar包
1.中文乱码
之前已经尝试过调用简单的jar包进行测试了,但是这次调用的时候遇到了中文乱码的问题,后面经过测试发现是python中的print函数的问题
import locale
print(locale.getdefaultlocale())
结果:
('zh_CN', 'cp936')
2.解决方法
参考文章:https://www.cnblogs.com/reconova-56/p/12629498.html
在startJVM方法中加入参数"-Dfile.encoding=UTF8"即可
if not jpype.isJVMStarted():
jpype.startJVM(jvmPath, "-Dfile.encoding=UTF8", "-ea", "-Djava.class.path=%s" % ext_classpath)