1. 程式人生 > >利用java程式碼實現java原始檔的編譯和打包為jar檔案

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


相關推薦

利用java程式碼實現java原始檔編譯打包jar檔案

一、編譯部分 public void complier() throws IOException { System.out.println("*** --> 開始編譯java原始碼..."

java程式碼實現資料的備份恢復

2、建立一個java專案並將jar包加入至構建路徑,如下圖: 3、測試程式碼如下: public class Test { MysqlManagerConfiguration config = new MysqlManagerConfiguration(); pu

java程式碼實現LogBack動態輸出日誌【無配置檔案程式碼

需求:       需要傳入某一個檔案或者類或者方法的名字,生成對應日誌檔案,且每一個傳入名字的檔案單獨有一個資料夾,子資料夾為日期,日期資料夾裡面包含warn.log,error.log,debug.log,info.log。通過過濾器實

ant的高階使用,ant命令詳解,ant打包,ant編譯打包去掉jar檔案

在日常的專案開發中,我們可以經常性的需要打包測試,尤其是開發環境是windows,而實際環境則是linux。 這樣的話,很多程式設計師要一會打一個包,一會打一個包,這些包可能會很大,實際上只有程式碼部

排序演算法總結(含動圖演示Java程式碼實現)

本文將圍繞氣泡排序、桶排序、計數排序、堆排序、插入排序、並歸排序、快速排序和選擇排序,按照描述、時間複雜度(最壞情況)、動態圖展示和程式碼實現來講解。本文預設排序為從小到大。 本文相關程式碼已上傳至github,歡迎關注https://github.com/zhuzhenke/commo

Java程式碼實現順序棧鏈式棧

Java程式碼實現順序棧和鏈式棧 棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入或者刪除運算。後進先出(Last In First Out)。 棧中的資料操作主要有push(壓入)和pop(彈出)操作。 實際上,棧就可以用陣列來實現,也可

java程式碼實現求樹的高度節點數

求二叉樹的高度 public int getHeight(TreeNode node){ if(node == null){ return 0; } int i = getHeight(nod

MapReduce實現兩表的Join--原理及pythonjava程式碼實現

用Hive一句話搞定的,但是有時必須要用mapreduce 方法介紹 1. 概述 在傳統資料庫(如:MYSQL)中,JOIN操作是非常常見且非常耗時的。而在HADOOP中進行JOIN操作,同樣常見且耗時,由於Hadoop的獨特設計思想,當進行JOIN操作時,有一

中文轉換成Unicode編碼Unicode編碼轉換成中文,Java程式碼實現

 import java.util.Properties; public class Test { public static void main(String[] args

(一)ArrayListLinkedList的原理、Java程式碼實現、效能比較

一、ArrayList1.1、陣列和集合的區別    動態大小,即陣列的大小不可變,集合的大小可變。    ArrayList從名字上來講是陣列列表,表面上是動態大小,其底層實現原理其實還是一個數組。1.2、簡單模擬ArrayList    模擬過程中要注意Array和Arr

java程式碼實現javac編譯功能

 (摘自 http://www.evget.com/zh-CN/Info/catalog/15816.html ) Java作為業界應用最為廣泛的語言之一,深得眾多軟體廠商和開發者的推崇,更是被包括Oracle在內的眾多JCP成員積極地推動發展。但是對於Java語言的深度理

利用Java程式碼實現把一個檔案從一個地方剪下到另一個地方

1、實現原理: 通過輸入流讀取檔案的內容,在通過輸出流把讀取到的內容輸出到其他檔案中,然後再讀取結束後刪除原來的檔案就完成了檔案的剪下。 1)首先在將要把檔案剪下到的地方建立一個同一個型別的檔案; 2)利用輸入流讀取原檔案的內容; 3)在讀取的過程中,把讀取到的內容通過輸出

APP利用token機制進行身份認證(理解token機制+簡單Java程式碼實現

什麼是token token的意思是令牌,想象一下用過的qq令牌,是來自(騰訊)服務端生成的一串字元,作為客戶端(我們自己)進行請求的一個標識。比如說:改qq密碼。而這裡我們是自己開發App,我們的使用者用token請求登入,我們對他進行身份認證。 當用戶第一

Java程式碼加密與反編譯(一):利用混淆器工具proGuard對jar包加密

Java 程式碼編譯後生成的 .class 中包含有原始碼中的所有資訊(不包括註釋),尤其是在其中儲存有除錯資訊的時候。所以一個按照正常方式編譯的 Java .class 檔案可以非常輕易地被反編譯。通常情況下,反編譯可以利用現有的工具jd-gui.exe或者jad.e

最小生成樹的Prim演算法Kruskal演算法java程式碼實現

MiniSpanTree中兩個靜態函式實現了最小生成樹的Prim演算法和Kruskal演算法: package datastucture; import java.util.ArrayList; import java.util.Arrays; import java.

CCF認證201803-2 碰撞的小球 java程式碼實現

問題描述   數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在座標L處。有n個不計體積的小球線上段上,開始時所有的小球都處在偶數座標上,速度方向向右,速度大小為1單位長度每秒。   當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。   當兩個小

億級別記錄的mongodb分頁查詢java程式碼實現

1.準備環境   1.1 mongodb下載   1.2 mongodb啟動      C:\mongodb\bin\mongod --dbpath D:\mongodb\data   1.3 視覺化mongo工具Robo 3T下載 2.準備資料    <d

生產者與消費者 程式碼實現 java

        首先,我利用忙測試寫出了第一次版本的程式碼       1 package How; 2 //自寫程式碼 缺陷 無法完全實現pv操作執行緒處於忙測試狀態 3 public class bin_1_1 4 { 5

Java程式碼實現負載均衡五種演算法

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/u012904383/article/details/78358354 前言:        

演算法學習——中國大學MOOC-陳越、何欽銘-資料結構-起步能力自測題——java程式碼實現

自測-1 列印沙漏 (20 point(s)) 本題要求你寫個程式把給定的符號列印成沙漏的形狀。例如給定17個“*”,要求按下列格式列印 ***** *** * *** ***** 所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大