利用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--原理及python和java程式碼實現
用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
(一)ArrayList和LinkedList的原理、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;符號數先從大