利用java代码实现java源文件的编译和打包为jar文件

一、编译部分


 

public void complier() throws IOException {

	System.out.println("*** --> 开始编译java源代码...");

	File javaclassDir = new File(javaClassPath);
	if (!javaclassDir.exists()) {
		javaclassDir.mkdirs();
	}

	List<String> javaSourceList = new ArrayList<String>();
	getFileList(new File(javaSourcePath), javaSourceList);

	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源代码编译完成。");
}



  
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());
				}
			}
		}
	}
   


二、打包部分

 
	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包生成完毕。");
	}
  

 
	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();
		}
	}
     

三、使用

 
	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();
	}
 


你可能感兴趣的:(源代码,jar,自动编译,java代码打包)