1. 程式人生 > 程式設計 >把Java程式轉換成exe,可直接執行的實現

把Java程式轉換成exe,可直接執行的實現

最近,專案不是很趕,突發奇想,打算寫一個定時提醒的軟體,設想即在某些指定的時刻,彈出彈窗,顯示一些設定的話,5s之後自動關閉。

定時提示這一部分很基礎,定時採用spring的@schedule的cron來設定,彈窗用Java Awt 來解決,不再贅述。專案寫完之後,用maven打成jar包,用exe4j 把jar包轉換成電腦 可執行檔案exe。記錄一下遇到的問題。

1、在springboot工程中執行程式,會提示一個java.awt.HeadlessException的錯誤,由於是全部解決完之後才記錄,並沒有上截圖。

解決方法:在新建Frame或者JFrame之前,新增程式碼 設定系統屬性。

System.setProperty("java.awt.headless","false");

2、如何讓彈窗顯示5s之後關閉。

解決方法:5s可以用執行緒的sleep方法,但是關閉彈窗,我之前採用的是System.exit(0)。 這個雖然可以關閉,但是是強行關閉整個Java執行程式,導致程式不能繼續執行,因此換成如下:

try {
  Thread.sleep(5000);
  frame.setVisible(false);//5s自動關閉
 } catch (InterruptedException e1) {
  e1.printStackTrace();
  System.exit(0);
 }

3、exe4j生成的exe執行報錯,提示NoClassDefException,找不到主類。

解決方法:在生成exe的第五步,選擇主類不要選擇專案的主類,而是選擇

org.springframework.boot.loader.PropertiesLauncher。。

即可

4、exe執行,提示沒有jre環境。(在沒有安裝jre的機器上執行)

解決的方法:需要把生成的exe和安裝好的jre檔案,打包發給別人。然後保證exe必須和jre在一個檔案下,正常執行

補充知識:解決子執行緒不共有父執行緒的請求上下文環境

正常的開啟子執行緒的時候,存在一個問題。

即 子執行緒並不具有父執行緒的請求上下文環境,比如說session,子執行緒在請求伺服器的時候是沒有session的,於是伺服器隨機生成一個session賦給他,這就導致一個問題。比如說微服務開發的時候,需要在子執行緒通過feign呼叫其他服務的介面,而這些被呼叫的介面一般都需要驗證是否具有許可權,此時,通過子執行緒訪問介面就會丟擲401或者403的許可權錯誤。

解決思路很簡單,即開啟子執行緒的時候,確保子執行緒共有父執行緒的請求上下文環境。只需要在啟動執行緒之前加上如下程式碼即可。

 
/**
 * 生成日報表
 * @param日期
 * */
 @POST
 @Path(value = "/generateDayreport")
 @Operation(code = 301,desc = "生成")
 public String lookDayreport(@RequestBody String req) throws BusinessAccessException{
 ExecutorService threadPool = Executors.newFixedThreadPool(5);
 Map<String,String> map = new HashMap<>();
 JSONObject jsonObject = JSONObject.parseObject(req);
 String date = jsonObject.getString("date");
 RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
 System.out.println("=ui==="+requestAttributes.getSessionId());
 RequestContextHolder.setRequestAttributes(requestAttributes,true);//子執行緒繼承主執行緒的上下文
 try {
  service.insertDayreport(date,"1","true");
  map.put("code","1");
 } catch (Exception e) {
  // TODO: handle exception
  e.printStackTrace();
  map.put("code","2");
 }
 GenerateDayReport generateDayReport = new GenerateDayReport(date);
 threadPool.execute(generateDayReport);
 threadPool.shutdown();
 return JSONObject.toJSONString(map);
 }

GenerateDayReport是實現Runable介面的類

以上這篇把Java程式轉換成exe,可直接執行的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。