最近,項目不是很趕,突發奇想,打算寫一個定時提醒的軟件,設想即在某些指定的時刻,彈出彈窗,顯示一些設定的話,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運行程序,導致程序不能繼續運行,因此換成如下:
1
2
3
4
5
6
7
|
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的權限錯誤。
解決思路很簡單,即開啟子線程的時候,確保子線程共有父線程的請求上下文環境。只需要在啟動線程之前加上如下代碼即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/** * 生成日報表 * @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,可直接運行的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/zhiweixlw/article/details/78926737