把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn)
最近,項(xiàng)目不是很趕,突發(fā)奇想,打算寫一個(gè)定時(shí)提醒的軟件,設(shè)想即在某些指定的時(shí)刻,彈出彈窗,顯示一些設(shè)定的話,5s之后自動(dòng)關(guān)閉。
定時(shí)提示這一部分很基礎(chǔ),定時(shí)采用spring的@schedule的cron來設(shè)定,彈窗用Java Awt 來解決,不再贅述。項(xiàng)目寫完之后,用maven打成jar包,用exe4j 把jar包轉(zhuǎn)換成電腦 可執(zhí)行文件exe。記錄一下遇到的問題。
1、在springboot工程中運(yùn)行程序,會(huì)提示一個(gè)java.awt.HeadlessException的錯(cuò)誤,由于是全部解決完之后才記錄,并沒有上截圖。
解決方法:在新建Frame或者JFrame之前,添加代碼 設(shè)置系統(tǒng)屬性。
System.setProperty("java.awt.headless", "false");
2、如何讓彈窗顯示5s之后關(guān)閉。
解決方法:5s可以用線程的sleep方法,但是關(guān)閉彈窗,我之前采用的是System.exit(0)。 這個(gè)雖然可以關(guān)閉,但是是強(qiáng)行關(guān)閉整個(gè)Java運(yùn)行程序,導(dǎo)致程序不能繼續(xù)運(yùn)行,因此換成如下:
try {
Thread.sleep(5000);
frame.setVisible(false);//5s自動(dòng)關(guān)閉
} catch (InterruptedException e1) {
e1.printStackTrace();
System.exit(0);
}
3、exe4j生成的exe運(yùn)行報(bào)錯(cuò),提示NoClassDefException,找不到主類。
解決方法:在生成exe的第五步,選擇主類不要選擇項(xiàng)目的主類,而是選擇
org.springframework.boot.loader.PropertiesLauncher。。
即可
4、exe運(yùn)行,提示沒有jre環(huán)境。(在沒有安裝jre的機(jī)器上運(yùn)行)
解決的方法:需要把生成的exe和安裝好的jre文件,打包發(fā)給別人。然后保證exe必須和jre在一個(gè)文件下,正常運(yùn)行
補(bǔ)充知識(shí):解決子線程不共有父線程的請(qǐng)求上下文環(huán)境
正常的開啟子線程的時(shí)候,存在一個(gè)問題。
即 子線程并不具有父線程的請(qǐng)求上下文環(huán)境,比如說session,子線程在請(qǐng)求服務(wù)器的時(shí)候是沒有session的,于是服務(wù)器隨機(jī)生成一個(gè)session賦給他,這就導(dǎo)致一個(gè)問題。比如說微服務(wù)開發(fā)的時(shí)候,需要在子線程通過feign調(diào)用其他服務(wù)的接口,而這些被調(diào)用的接口一般都需要驗(yàn)證是否具有權(quán)限,此時(shí),通過子線程訪問接口就會(huì)拋出401或者403的權(quán)限錯(cuò)誤。
解決思路很簡單,即開啟子線程的時(shí)候,確保子線程共有父線程的請(qǐng)求上下文環(huán)境。只需要在啟動(dòng)線程之前加上如下代碼即可。
/**
* 生成日?qǐng)?bào)表
* @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是實(shí)現(xiàn)Runable接口的類
以上這篇把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis圖文并茂講解注解開發(fā)一對(duì)多查詢
這篇文章主要介紹了SpringBoot中Mybatis注解一對(duì)多查詢的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
java不用循環(huán)語句打印數(shù)組元素的實(shí)例
下面小編就為大家?guī)硪黄猨ava不用循環(huán)語句打印數(shù)組元素的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
Java進(jìn)行Appium自動(dòng)化測試的實(shí)現(xiàn)
這篇文章主要介紹了Java進(jìn)行Appium自動(dòng)化測試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
前端dist包放到后端springboot項(xiàng)目下一起打包圖文教程
這篇文章主要介紹了前端dist包放到后端springboot項(xiàng)目下一起打包的相關(guān)資料,具體步驟包括前端打包、將前端文件復(fù)制到后端項(xiàng)目的static目錄、后端打包、驗(yàn)證部署成功等,需要的朋友可以參考下2025-01-01
微服務(wù)?Spring?Boot?整合?Redis?BitMap?實(shí)現(xiàn)?簽到與統(tǒng)計(jì)功能
這篇文章主要介紹了微服務(wù)?Spring?Boot?整合?Redis?BitMap?實(shí)現(xiàn)?簽到與統(tǒng)計(jì)功能,文章簡單介紹了Redis BitMap 基本用法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
spring mvc中@PathVariable / 帶斜杠方式獲取
這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
IDEA無法識(shí)別相關(guān)module模塊問題的解決過程
這篇文章主要給大家介紹了關(guān)于IDEA無法識(shí)別相關(guān)module模塊問題的解決過程,文中通過圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用IDEA具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
通過實(shí)例了解java spring使用構(gòu)造器注入的原因
這篇文章主要介紹了通過實(shí)例了解spring使用構(gòu)造器注入的原因,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

