問題描述: 利用pyinstaller對python代碼打包後,dist文件夾中會生成一個xxx.exe可執行文件。打包成功,但運行exe時一閃而過(閃退)。捕捉不對到底是打包錯誤呢,還是其他異常?那麼如何解決? PS:以上現象在windows系統中會出現,在Linux和mac系統中不會出現。 解決 ...
由於特定情況,本機下有多個jdk,而JAVA_HOME又只有一個。
本人習慣在命令行下一個命令編譯打包程式,如何解決這個問題? 研究了不少時間,得到了兩個解決方案:
1.使用bat -- 非常爛,不是很建議,如果您是系統管理員則另當別論。因為我們都知道編寫純bat實在不是很愉快,bat的語法是反人類的,至少讓程式員很看不慣
2.bat結合python --使用極少的bat結合python,實際就是在bat中調用python文件解決一些參數問題
兩種方案都要求批處理的第一個參數必須是jdk版本,目前這個參數的值簡化為 JDK17 或者其它值
如果不介意多打一些命令,就不要考慮後文內容。
一、maven項目中pom的build部分
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>copy-resources</id> <phase>process-resources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.outputDirectory}</outputDirectory> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.java</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <release>17</release> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
註意jdk17中 compile部分使用release不需要使用source,target,但要繼續用,好像也可以。
至於是否保留源碼,看項目要求。
二、純bat方案
在一個設置了path變數值的目錄(例如 d:\dev\bat\)下創建文件maven.bat,內容如下:
@echo off rem set s=AAA BBB CCC DDD EEE FFF ask=sssss set s=%* set t=%s% setlocal enableextensions enabledelayedexpansion set /a result2 set /a q=0 set /a firstParam :loop for /f "tokens=1*" %%a in ("%t%") do ( rem echo %%a set t=%%b if !q! gtr 0 set result2=!result2!%%a if !q! equ 0 ( ECHO 第一個參數:%%a 需要被忽略 set firstParam=%%a ) set /a q=q+1 echo !q! %%a ) if defined t goto :loop rem set /a q=q-1 echo 原來輸入參數個數:%q% rem set result2=!result2:~1,-1! echo 第一個參數是:%firstParam% echo 新參數字元串:!result2! if %firstParam%==jdk17 ( echo 您選擇的是JDK17 goto chooseJDK17 ) if %firstParam%==JDK17 ( echo 您選擇的是JDK17 goto chooseJDK17 ) SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_251 goto runMaven :chooseJDK17 SET JAVA_HOME=C:\Program Files\Java\jdk-17.0.1 goto runMaven :runMaven mvn !result2!
maven JDK17 clean compile package install -Dmaven.skip.test=true
結果成功,具體略。
三、bat結合python
先寫bat文件 new-maven.bat
python D:\soft\java\apache-maven-3.8.4-bin\bin\maven.py %*
然後是maven.py文件
import sys import os def main(): _maven(sys.argv); def _maven(args): i=0 argQty=len(args); newArgStr=""; jdkVersion="" print(f"總的參數個數是:{argQty}") for j in range(1,argQty): if j==1: jdkVersion=args[j]; else: print(args[j]) newArgStr=newArgStr+" "+args[j] print(f"第一個參數{jdkVersion}表示JDK版本,真正的參數是:{newArgStr}") setCmd="" if (jdkVersion.lower()=="jdk17"): setCmd="set JAVA_HOME=C:\Program Files\Java\jdk-17.0.1" else: setCmd="set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_251" print(f"執行新的bat命令:{setCmd}"); setCmd="cmd /c \""+setCmd+"& mvn "+newArgStr+"\""; print(f"新構建命令是 {setCmd}") os.system(setCmd); if __name__ == "__main__": main()
new-maven JDK17 clean compile package install -Dmaven.skip.test=true
結果成功,具體略。
四、小結
1.作為程式員,bat要會,但是如果環境允許,還是不要用bat編寫批處理腳本。同理在linux中也儘量可以把腳本語言調整為python
現在的linux系列的伺服器,版本新一些的,一般可以預設安裝python,所以寫python腳本還是非常方便的。
如果是windows伺服器,安裝一個python也非常容易
2.bat和bash的語法實在很不友好,而且容易遺忘,遠遠不如寫python程式來得直接
這裡列出bat幾點吐槽的地方:
a.處理命令行傳參
b.字元串操作,幼稚,難記,看起來非常奇怪的語法
c.變數賦值 ,還要弄清楚什麼延遲變數等奇怪的內容
d.條件語句,寫複雜的if else if 簡直要命
沒有什麼是特別好用。為什麼微軟會搞這種情況怪的語法?腦袋大概被砸了?炫技的充分性很足?
但如果腳本和這些沒有太大關係,倒是不反對用bat或者bash寫,例如這樣的bat
mkdir test
dir test