1. 程式人生 > >java原生API生成Jar包

java原生API生成Jar包

一、編譯部分

  1. publicvoid complier() throws IOException {  
  2.     System.out.println("*** --> 開始編譯java原始碼...");  
  3.     File javaclassDir = new File(javaClassPath);  
  4.     if (!javaclassDir.exists()) {  
  5.         javaclassDir.mkdirs();  
  6.     }  
  7.     List<String> javaSourceList = new ArrayList<String>();  
  8.     getFileList(new File(javaSourcePath), javaSourceList);  
  9.     JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();  
  10.     int result = -1;  
  11.     for (int i = 0; i < javaSourceList.size(); i++) {  
  12.         result = javaCompiler.run(nullnullnull"-d", javaClassPath, javaSourceList.get(i));  
  13.         System.out.println(result == 0 ? "*** 編譯成功 : " + javaSourceList.get(i) : "### 編譯失敗 : " + javaSourceList.get(i));  
  14.     }  
  15.     System.out.println("*** --> java原始碼編譯完成。");  
  16. }  


  1. privatevoid getFileList(File file, List<String> fileList) throws IOException {  
  2.         if (file.isDirectory()) {  
  3.             File[] files = file.listFiles();  
  4.             for (int i = 0; i < files.length; i++) {  
  5.                 if (files[i].isDirectory()) {  
  6.                     getFileList(files[i], fileList);  
  7.                 } else {  
  8.                     fileList.add(files[i].getPath());  
  9.                 }  
  10.             }  
  11.         }  
  12.     }  


二、打包部分

  1. publicvoid generateJar() throws FileNotFoundException, IOException {  
  2.     System.out.println("*** --> 開始生成jar包...");  
  3.     String targetDirPath = targetPath.substring(0, targetPath.lastIndexOf("/"));  
  4.     File targetDir = new File(targetDirPath);  
  5.     if (!targetDir.exists()) {  
  6.         targetDir.mkdirs();  
  7.     }  
  8.     Manifest manifest = new Manifest();  
  9.     manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");  
  10.     JarOutputStream target = new JarOutputStream(new FileOutputStream(targetPath), manifest);  
  11.     writeClassFile(new File(javaClassPath), target);  
  12.     target.close();  
  13.     System.out.println("*** --> jar包生成完畢。");  
  14. }  

  1. privatevoid writeClassFile(File source, JarOutputStream target) throws IOException {  
  2.     BufferedInputStream in = null;  
  3.     try {  
  4.         if (source.isDirectory()) {  
  5.             String name = source.getPath().replace("\\", "/");  
  6.             if (!name.isEmpty()) {  
  7.                 if (!name.endsWith("/")) {  
  8.                     name += "/";  
  9.                 }  
  10.                 name = name.substring(javaClassPath.length());  
  11.                 JarEntry entry = new JarEntry(name);  
  12.                 entry.setTime(source.lastModified());  
  13.                 target.putNextEntry(entry);  
  14.                 target.closeEntry();  
  15.             }  
  16.             for (File nestedFile : source.listFiles())  
  17.                 writeClassFile(nestedFile, target);  
  18.             return;  
  19.         }  
  20.         String middleName = source.getPath().replace("\\", "/").substring(javaClassPath.length());  
  21.         JarEntry entry = new JarEntry(middleName);  
  22.         entry.setTime(source.lastModified());  
  23.         target.putNextEntry(entry);  
  24.         in = new BufferedInputStream(new FileInputStream(source));  
  25.         byte[] buffer = newbyte[1024];  
  26.         while (true) {  
  27.             int count = in.read(buffer);  
  28.             if (count == -1)  
  29.                 break;  
  30.             target.write(buffer, 0, count);  
  31.         }  
  32.         target.closeEntry();  
  33.     } finally {  
  34.         if (in != null)  
  35.             in.close();  
  36.     }  
  37. }  

三、使用
  1. publicstaticvoid main(String[] args) throws IOException, InterruptedException {  
  2.     String currentDir = "c:/myProject";  
  3.     String javaSourcePath = currentDir + "/src/main/java/";  
  4.     String javaClassPath = currentDir + "/classes";  
  5.     String targetPath = currentDir + "/target/MyProject.jar";  
  6.     CompilerAndJarTools cl = new CompilerAndJarTools(javaSourcePath, javaClassPath, targetPath);  
  7.     cl.complier();  
  8.     cl.generateJar();  
  9. }