无为

无为则可为,无为则至深!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

在外国技术论坛看到一个使用Java API中的java.util.jar 类来创建和编译Jar的小程序。我参照那个小程序,编写了一个例子。创建一个Test.java并放在在pack目录里,在文件所在目录编译Java源码,这时将建立一个包含目录中所有文件的所有JAR压缩文件。源码如下:
  1 import java.io.*;
  2 import java.util.*;
  3 import java.util.jar.*;
  4 
  5 public class Util {
  6     private String dirName = "D:/3000/compileTest";
  7     private String srcDirName = dirName + "/src";
  8     private String jarDirName = dirName + "/jar";
  9     
 10     public static void main(String[] args) {
 11         Util u = new Util();
 12         u.test();
 13     }
 14     
 15     public void test() {
 16         this.writeJavaSource();
 17         List srcList = new LinkedList();
 18         this.addFilesFromDirectory(new File(this.srcDirName), srcList, ".java");
 19         this.compileAll(srcList);
 20         this.createJar(this.jarDirName + "/test.jar"new File(this.srcDirName));
 21     }
 22 
 23     public void writeJavaSource() {
 24         File dir = new File(this.srcDirName + "/pack");
 25         if (!dir.isDirectory()) {
 26             dir.mkdir();
 27         }
 28         File file = new File(this.srcDirName + "/pack""Test.java");
 29         PrintWriter writer;
 30         try {
 31             writer = new PrintWriter(new FileWriter(file));
 32             writer.println("package pack;");
 33             writer.println();
 34     
 35             writer.println("public class Test {");
 36             writer.println(""tpublic void test() {");
 37             writer.println(""t"tSystem.out.println(""test"");");
 38             writer.println(""t}");
 39             writer.println("}");
 40             writer.close();
 41         } catch (IOException e) {
 42             e.printStackTrace();
 43         }
 44     }
 45 
 46     public void compileAll(List allFileNames) {
 47         Iterator it = allFileNames.iterator();
 48         String[] allFiles = new String[allFileNames.size()];
 49         int index = 0;
 50         while (it.hasNext()) {
 51             String currFilename = (String) it.next();
 52             System.out.println("Adding " + currFilename + " to compilation");
 53             allFiles[index++= currFilename;
 54         }
 55         System.out.println("Starting compilation process on " + index
 56                 + " files");
 57         long time0 = System.currentTimeMillis();
 58         int compileReturnCode = com.sun.tools.javac.Main.compile(allFiles);
 59         long time1 = System.currentTimeMillis();
 60         System.out.println((time1 - time0) + " milliseconds, "
 61                 + ((compileReturnCode == 0? "success" : "failure"));
 62     }
 63     public void addFilesFromDirectory(File directory, List allFiles, String extension) {
 64         File[] fileArray = directory.listFiles();
 65         for (int i=0; i<fileArray.length; i++) {
 66             File currFile = fileArray[i];
 67             if (currFile.isFile()) {
 68                 String name = currFile.getAbsolutePath();
 69                 if (name.endsWith(extension))
 70                     allFiles.add(name);
 71             }
 72             else
 73                 addFilesFromDirectory(currFile, allFiles, extension);
 74         }
 75     }
 76     
 77     public void addDirectoriesFromDirectory(File directory, List dirFiles) {
 78         File[] fileArray = directory.listFiles();
 79         for (int i=0; i<fileArray.length; i++) {
 80             File currFile = fileArray[i];
 81             if (!currFile.isFile()) {
 82                 String name = currFile.getAbsolutePath();
 83                 dirFiles.add(name);
 84                 addDirectoriesFromDirectory(currFile, dirFiles);
 85             }
 86         }
 87     }
 88 
 89     public void createJar(String jarName, File directory) {
 90         Manifest manifest = new Manifest();
 91         manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
 92         
 93         File jarFile = new File(jarName);
 94         try {
 95             OutputStream fileOut = new FileOutputStream(jarFile);
 96             JarOutputStream jarOut = new JarOutputStream(fileOut, manifest);
 97             
 98             createJar(jarOut, directory);
 99             jarOut.flush();
100             jarOut.finish();
101         }
102         catch (Exception e) {
103             e.printStackTrace();
104         }
105         System.out.println("Created " + jarName);
106     }
107     
108     public void createJar(JarOutputStream jarOut, File directory) {
109         try {
110             File[] fileArray = directory.listFiles();
111             byte buffer[] = new byte[1024];
112             int bytesRead;
113             for (int i=0; i<fileArray.length; i++) {
114                 File currFile = fileArray[i];
115                 if (currFile.isDirectory()) {
116                     createJar(jarOut, currFile);
117                 }
118                 else {
119                     String currFilename = currFile.getName();
120                     // 为了防止将完整文件名都放进JAR中必须分离文件名为目录和类名
121 
122                     String pathInJar = directory.getAbsolutePath();    
123                     pathInJar = pathInJar.substring(this.srcDirName.length()+1);
124                     
125                     JarEntry entry = new JarEntry(pathInJar + "/" + currFilename);
126                     jarOut.putNextEntry(entry);
127                         entry.setMethod(JarEntry.DEFLATED);
128     
129                     File file = new File(directory, currFilename);
130                     FileInputStream fis = new FileInputStream(file);
131                     while ((bytesRead = fis.read(buffer)) != -1) {
132                         jarOut.write(buffer, 0, bytesRead);
133                     }
134                     fis.close();
135                     jarOut.flush();
136                     jarOut.closeEntry();
137                 }
138             }
139         } catch (IOException ex) {
140             ex.printStackTrace();
141         }
142     }
143 }




凡是有该标志的文章,都是该blog博主Caoer(草儿)原创,凡是索引、收藏
、转载请注明来处和原文作者。非常感谢。

posted on 2007-09-15 15:09 草儿 阅读(1289) 评论(3)  编辑  收藏

Feedback

# re: 在代码中编译和创建Jar 2007-09-15 18:55 千里冰封
挺好用的.  回复  更多评论
  

# re: 在代码中编译和创建Jar 2007-12-09 03:37 woloo
fix:

String pathInJar = directory.getAbsolutePath();
==>
String pathInJar = currFile.getAbsolutePath();   回复  更多评论
  

# re: 在代码中编译和创建Jar[未登录] 2007-12-19 01:48 joe
很好用,谢谢了。解决我的大问题了!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: