2017-08-02 27 views
1

這是how to execute a built fat JAR as a gradle task?的後續問題 我沒有足夠的觀點來問我的問題作爲評論。所以我必須再問一次。這個問題已多次被其他格式和場景詢問過,但這些迴應都沒有幫助我。如何用gradle創建的fatJar中的主要方法執行一個類

我的問題:

場景1:創建使用的gradle fatJar依賴性的單罐

方案2:使用行家組件創建具有相關性的單一罐

執行

java -cp sample.jar com.example.ClassA 

這兩個進程中生成的jar文件。

問題:從過程1 罐子給我

錯誤:無法找到或從過程2正確執行加載主類com.example.ClassA

罐子。

我已經提取了兩個jar文件,並且它們都具有相同的文件夾結構和相同的文件 - 表示編譯後的類文件存在於兩個jar文件中。

我沒有在任何進程中指定任何清單條目,因爲我有多個主類,而且我沒有嘗試生成可執行的jar文件。

我的build.gradle文件看起來像如下:

apply plugin: 'java' 
apply plugin: 'maven' 

sourceCompatibility = 1.8 
targetCompatibility = 1.8 

repositories { 
    mavenLocal() 
} 

sourceSets { 
    main{ 
     java{ 
     srcDirs 'src/main/java' 
      } 
     } 
} 

processResources { 
    from 'src/main/resources' 
} 

task compile (type: JavaCompile) { 
    source = sourceSets.main.java.srcDirs 
    include '**/*.java' 
    classpath = sourceSets.main.compileClasspath 
    destinationDir = sourceSets.main.output.classesDir 
} 

compile.options.compilerArgs = ["-sourcepath", "$projectDir/src/main/java"] 

dependencies { 
    . 
    . 
    . 

} 

task fatJar(type:Jar) { 
    baseName = 'xxxxxxx' 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    with jar 
} 

defaultTasks 'clean', 'compile', 'fatJar' 

編輯 - 1:

我試圖相對路徑罐子,絕對路徑罐子,甚至瀏覽到包含文件夾罐子裏。沒有任何運氣。

我試過使用'/'而不是'。'。在包名中。那裏也沒有運氣。

我已經嘗試使用Java虛擬機參數提供足夠大的堆空間。納達。

試圖在PowerShell上執行。得到以下錯誤:

+ CategoryInfo   : NotSpecified: (Error: Could not lo...ClassA:String) [], RemoteException 

+ FullyQualifiedErrorId : NativeCommandError 

我想直接看到內容使用jar -tvf path_to_jar \ sample.jar。有趣的是,jar命令沒有執行並且抱怨在類路徑中沒有找到命令。我不得不瀏覽到java安裝目錄並執行命令並顯示文件內容。

我在這裏沒有想法和選擇。 任何指針?

回答

0

看起來您的執行命令無效。以建設項目後:

./gradlew clean fatJar 

你應該使用下面的命令來運行你的程序:

java -cp build/libs/xxxxxxx.jar com.example.ClassA 

參數-cp build/libs/xxxxxxx.jar設置classpath中JVM是即將開始,它必須指向現有的JAR文件(您可以使用該文件的相對路徑或絕對路徑)。

看看下面的截屏我錄的幾分鐘前:

你可以看到,如果我改變執行命令:

java -cp xxxxxxx.jar com.example.ClassA 

我完全與您的相同錯誤:

Error: Could not find or load main class com.example.ClassA 

在這裏您可以找到simple Gradle project我曾經玩過你的build.gradle文件的例子。我已經添加了一個依賴關係來證明fatJar構建了一個依賴關係的JAR,並且我添加了與public static void main(String[] args)的類來證明您可以從命令行選擇任何主類。我希望它有幫助。

+0

@ 2194470我看到情侶您所做的與我的場景之間的差異。 1.我在Windows上測試,你可能在Mac上做過。我認爲這與這個問題沒有任何關係。 2.我使用簡單的「gradle」命令執行fatJar,並使用「graddew」包裝器命令。我會試試這個,讓你知道。順便說一句,在執行fatJar時使用gradle和gradlew有什麼區別嗎? –

+0

我幾乎可以肯定你的問題是由於你在'java -cp ...'命令中傳遞的JAR文件的錯誤路徑導致的。嘗試首先將絕對路徑傳遞給此文件。由於JVM引發此錯誤,因此Windows/Linux差異不應該成爲問題。使用'gradlew'與本地安裝的'gradle'相比沒有區別 - 我使用它主要是因爲它更容易與其他版本的Gradle分享。 –

+0

用額外的評論編輯這個問題,你能再次檢查它嗎? –

0

由於某些原因,無論我使用哪種配置來使用fatJar,最終的jar在嘗試執行主類時都會出錯。

使用ShadowJar任務我能夠構建必要的jar並執行問題中指定的主類。

我知道這打破了關於使用fatJar和執行主類的問題的全部目的。但由於時間限制,我不得不尋找替代品。

對於那些誰正在尋找配置的陰影罐的任務,我做到了用下面:

buildscript { 
    repositories { 
     mavenLocal()  
     dependencies { 
      classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' 
     } 
    } 
} 


apply plugin: 'com.github.johnrengelman.shadow' 

,最終執行任務,我用

gradle shadowJar 
相關問題