java原生API生成Jar包
阿新 • • 發佈:2019-01-03
一、編譯部分
- publicvoid 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原始碼編譯完成。");
- }
- privatevoid 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());
- }
- }
- }
- }
二、打包部分
- publicvoid 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包生成完畢。");
- }
- privatevoid 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 = newbyte[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();
- }
- }
三、使用
- publicstaticvoid 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();
- }