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

来源:互联网 发布:抑郁症的表现 知乎 编辑:程序博客网 时间:2024/05/24 01:13

一、编译部分


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


0 0
原创粉丝点击