日常開發過程中將一些頻繁操作進行自動化腳本處理,可以做到事半功倍。把時間花費到重要的事情上面。最近進行項目自動化處理,寫了一個java swing的工具,開發過程中遇到的問題記錄如下。
首先介紹下如何將java程序打成可執行的jar
方式1 eclipse ide
方式2 IntelliJ ide
早期用eclipse進行可執行jar打包,最近使用intelJ 打包。這裏介紹intelJ ide簡單打包方式。
用到ide版本: IntelliJ IDEA Educational Edition 2019.3 x64
如圖
File–>projectStructure -->Artifacts–>JAR–>From modules with dependenties
選擇打入jar的module文件夾,選擇啓動主類,也就是程序的入口main()函數的類。點擊確定
然後build jar
查看可執行jar包輸出位置。
步驟2.
進入cmd窗口。驗證
不出意外的話,命令就可以執行了。如果是java swing寫的jar。就會打開swing窗口了。
步驟3
開發過程中遇到需要對jar包中文件進行替換的操作。方案採用jar腳本進行修改。
命令1.替換jar包中文件夾
jar uvf xxxx.jar jar包中文件夾/
tip: 命令1替換爲全部替換,並不會替換單個文件。比如jar包中有test文件夾,包含1,2,3,4 文件。 如果替換 test文件內的某一個文件,需要在同級目錄建立test文件夾並且包含 1,2,3,4文件。否則,會用外部同級test替換jar中test。外部test包含 1,2,替換之後jar包中test文件夾中的1,2,3,4 文件會被替換爲1,2。
命令2 替換jar包中嵌套文件jar
jar uvf xxxx.jar jar包中文件夾/嵌套文件夾/
tips:層級目錄一定要一致。
命令3 將某文件夾下的文件打入jar包目錄下。層級不需要一致
jar uf xxx.jar -C 需要打入jar目錄下的文件路徑 . (最後面是一個點 .)
以上命令在cmd窗口中執行沒有問題,如果使用java程序進行運行,效果還不一致。如下一個執行cmd命令的jar類。
public static int ececute(String cmd,boolean isNeedPrint)
{
Process proc = null;
int result = -1;
try {
List<StreamReader> list = new ArrayList<StreamReader>();
proc = Runtime.getRuntime().exec(cmd);
StreamReader error = new StreamReader(proc.getErrorStream(), "Error");
StreamReader output = new StreamReader(proc.getInputStream(), "Output");
if (isNeedPrint) {
list.add(error);
list.add(error);
}
error.start();
output.start();
if (isNeedPrint) {
for (StreamReader sr : list) {
sr.join();
}
}
result = proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
proc.destroy();
}
return result;
}
package panel;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class StreamReader extends Thread
{
InputStream is;
String type;
StreamReader(InputStream is, String type)
{
this.is = is;
this.type = type;
}
public void run()
{
InputStreamReader isr = null;
BufferedReader br = null;
try
{
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
{
System.out.println(line);
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
close(isr, br);
}
}
public void close(InputStreamReader isr, BufferedReader br)
{
if (null != br)
{
try
{
br.close();
}
catch (IOException e)
{
br = null;
}
}
if (null != isr)
{
try
{
isr.close();
}
catch (IOException e)
{
isr = null;
}
}
}
}
tips 。使用命令 jar uvf xxxx.jar -C 文件路徑\路徑\ ,會導致jar中自動生成的mete-info 被忽略,測試了下被忽略後沒有影響,依然可以正常使用。
如圖
整理:
通過幾天研究,瞭解java swing機制,通過將命令行界面化提供給非開發人員使用,學習成本更低。瞭解了jar 腳本的使用方法。將一些需要收到頻繁操作步驟改成界面方式一鍵處理,大大提高了效率。解放了雙手。
成品
看似簡單處理,將過去需要通過手動調整配置文件,改爲自動。一次大概可以省下來十多分鐘,對於頻繁出包改配置操作,可想而知。