intellij idea 打可執行scala jar 包的兩種方式
今天折騰了一天 研究 idea 打可執行scala 程式碼的 jar 包。有些心得記錄下來,供大家參考,希望能幫助到一些同事。
此前在網路上有一些關於打jar 包的資料,大都是一些轉載,或者介紹的不是很詳細。此篇是詳細介紹打包過程以及思考推導方式,供大家參考。
此文章分為 1 IDEA 打可執行jar 包
2 idea maven 打可執行jar 包
兩個部分介紹
IDEA 打可執行 jar 包
先建立scala project FILE-->new --> project -->scala
然後輸入自己的專案名稱 建立OBJECT MAIN
注意: 要先配置 jdk 環境和 scala 環境 否則程式會報錯,本篇文章不過度引申此細節。
然後開始配置打包 File--->project structure --> Artifacts 然後點選 "+"
待出現彈窗後寫入自己配置的主類 如圖:
寫入自己配的含有 main object 點選OK 然後 會顯示如下介面
如上圖:黑色框代表你jar 的生成路徑 , 紅色框代表已經加入到打包裡面的資訊,綠色框代表你自此打包的被呼叫的主函式類,紫色框是IDEA認為你有可能需要新增入jar 中的其他類庫。
一切資訊就緒點選OK
然後觀察左側 IDEA 會自動重新整理變化 在src 目錄下 idea 自動生成了 META_INF 這個資料夾 如圖:
此處生成的MANIFEST.MF 是非常有用的為檔案,先買一個官司,待會再講這個檔案。
一切就緒開始生成 可執行檔案!
BUILD---->BUILD Artifact ----> BUILD
如圖:
在生成路徑下尋找你生成的jar 包 如圖:
然後用 java -jar 命令執行它
返回結果如圖:
恭喜你! 你已經可以成功執行 scala 可執行jar 檔案了!!
但是可以以此方法執行 maven 的 jar 嗎?
開始配置maven 工程 新增maven 依賴
點選專案 ----右鍵 --->Add FrameWorkSupport -->maven 勾選
選擇完之後系統會自動生成POM.xml檔案 如圖:
注意:此處為了演示方便排除其他干擾所以 pom裡面沒有設定任何依賴,只是初始pom.xml
然後開啟maven 檢視 view-->Tool Windows-->Maven Projects
如圖:
此檢視列舉了 maven生命週期,以及各種外掛,plugins下面的可以按照使用者需求自行新增。
然後配置maven 本地依賴庫 settings ---> 搜尋maven
然後再次 執行上述步驟 打包 注意此處 再次打包需要刪除 原來的 META -INF 資料夾,否則IDEA不會按照新maven工程方式打包!!
刪除檔案再次打包,然後呼叫java -jar 你的包名 .jar
發現如下錯誤,如圖:
思考:僅僅引入maven 以同樣方式打包卻會出現找不到main 函式,貌似jar包裡面沒有指定main 函式入口。但是沒有改任何配置啊?明明主類已經指定?
看來maven工程的打包方式不應該用idea 原生方式打包。
檢視jar 檔案裡資訊。我們會發現
解釋: 紅色框為記錄關於jar 包的一些基本資訊,綠色框 scala 是scala 程式依賴, 黑色框 testscalajar3 你寫的程式包,紫色框 一些配置檔案。
進入 META-INF 發現裡面有一個 MANIFEST.MF 的配置檔案. 開啟它
貌似記錄了一大堆有的沒的 ,沒啥價值,不死心,再看看之前執行成功的jar MANIFEST.MF 資訊 內容很簡單隻有兩行程式碼
如圖:
這個MaNIFEST.MF和前者只有 這個區別 在前者的 MaNiFEST.MF 裡面沒有找到 Main-Class 標示
嘗試 :把此行拷貝到 之前的 jar 對應檔案中如圖:
然後放入jar 包。接著執行 java -jar 指令 程式正常執行!!!
但是此種方法 每次打jar 包都要頻繁操作 太過於麻煩.所以採用第二種方式 idea Maven 打jar 包方式
Maven 打可執行Jar 包。網上介紹的可以參考借鑑隨便拿來一種配置在POM.xml 中如圖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>groupId</groupId><artifactId>testScalaJar</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies>
<!--你的諸多依賴
-->
</dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>2.5.5</version><configuration><archive><manifest><mainClass>com.testscalajar.StreamingTest</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>
在右側的IDEA會出現依賴顯示
貌似一切就緒 直接點選 lifcycle --->package 生成 jar 檔案
注意:此種生成方式 需要你提前刪除 目標資料夾下面檔案,否則會報錯 。
刪除該資料夾下面所有 檔案 再點選 package 觀看IDEA 控制檯 打包成功
在target 資料夾下面生成了 testScalaJar-1.0-SNAPSHOT-jar-with-dependencies.jar 檔案
然後開啟 看看有沒有主函式
有! 看來可以安心執行了 。執行 java -jar
出現如下問題:
為什麼 還會報這種問題?但是貌似問題和 沒有主程式清單 錯誤有所不同,在觀察jar 包。
竟然發現 沒有自己的 com.testscalajar.streamingTest.class 而只有 testJava.class ... 也就是說只有 .java的檔案被編譯了,而 .scala的檔案沒有被編譯!!
結論: maven 預設只編譯java 的檔案,而不會編譯scala 檔案。但是maven 提供了 能夠編譯scala 的類庫。因此再次改造POM.xml
加入如下 plugin 此外掛是Maven 用來編譯 scala 的外掛
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
然後刪除target 下所有檔案再次點選package 進行打包
再次執行 java -jar 命令 程式 正常執行!!
總結:兩種方式都可以實現 打maven 執行包.但後者更加便捷,而且maven 提供了豐富的plugin外掛,以及優雅的打包,編譯等方式(只需點選,而不用像eclipse那樣輸入maven指令)