1. 程式人生 > >intellij idea 打可執行scala jar 包的兩種方式

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指令)