1、編譯部分java
[java] view plaincopyide
public void complier() throws IOException { .net
System.out.println("*** --> 開始編譯java源代碼..."); code
File javaclassDir = new File(javaClassPath); blog
if (!javaclassDir.exists()) { ip
javaclassDir.mkdirs(); get
} string
List<String> javaSourceList = new ArrayList<String>(); it
getFileList(new File(javaSourcePath), javaSourceList); io
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
int result = -1;
for (int i = 0; i < javaSourceList.size(); i++) {
result = javaCompiler.run(null, null, null, "-d", javaClassPath, javaSourceList.get(i));
System.out.println(result == 0 ? "*** 編譯成功 : " + javaSourceList.get(i) : "### 編譯失敗 : " + javaSourceList.get(i));
}
System.out.println("*** --> java源代碼編譯完成。");
}
[java] view plaincopy
private void getFileList(File file, List<String> fileList) throws IOException {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
getFileList(files[i], fileList);
} else {
fileList.add(files[i].getPath());
}
}
}
}
2、打包部分
[java] view plaincopy
public void generateJar() throws FileNotFoundException, IOException {
System.out.println("*** --> 開始生成jar包...");
String targetDirPath = targetPath.substring(0, targetPath.lastIndexOf("/"));
File targetDir = new File(targetDirPath);
if (!targetDir.exists()) {
targetDir.mkdirs();
}
Manifest manifest = new Manifest();
manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
JarOutputStream target = new JarOutputStream(new FileOutputStream(targetPath), manifest);
writeClassFile(new File(javaClassPath), target);
target.close();
System.out.println("*** --> jar包生成完畢。");
}
[java] view plaincopy
private void writeClassFile(File source, JarOutputStream target) throws IOException {
BufferedInputStream in = null;
try {
if (source.isDirectory()) {
String name = source.getPath().replace("\\", "/");
if (!name.isEmpty()) {
if (!name.endsWith("/")) {
name += "/";
}
name = name.substring(javaClassPath.length());
JarEntry entry = new JarEntry(name);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
target.closeEntry();
}
for (File nestedFile : source.listFiles())
writeClassFile(nestedFile, target);
return;
}
String middleName = source.getPath().replace("\\", "/").substring(javaClassPath.length());
JarEntry entry = new JarEntry(middleName);
entry.setTime(source.lastModified());
target.putNextEntry(entry);
in = new BufferedInputStream(new FileInputStream(source));
byte[] buffer = new byte[1024];
while (true) {
int count = in.read(buffer);
if (count == -1)
break;
target.write(buffer, 0, count);
}
target.closeEntry();
} finally {
if (in != null)
in.close();
}
}
3、使用
[java] view plaincopy
public static void main(String[] args) throws IOException, InterruptedException {
String currentDir = "c:/myProject";
String javaSourcePath = currentDir + "/src/main/java/";
String javaClassPath = currentDir + "/classes";
String targetPath = currentDir + "/target/MyProject.jar";
CompilerAndJarTools cl = new CompilerAndJarTools(javaSourcePath, javaClassPath, targetPath);
cl.complier();
cl.generateJar();
}