2017-08-26 38 views
0

我想通過gradle創建並運行可執行的jar。這是我目前gradle這個樣子:如何創建然後在Intellij IDE中運行帶有依賴項的可執行jar文件,特別是Android Studio?

task jarTask(type: Jar) { 
    baseName = 'my-main-class' 
    from 'build/classes/main' 
} 

task createJarWithDependencies(type: Jar) { 
    manifest { 
     attributes 'Implementation-Title': 'Sample Jar', 
        'Implementation-Version': 1, 
       'Main-Class':'com.example.MyMainClass' 
    } 
    baseName = "my-main-class-with-dependencies" 
    from { 
     configurations.compile.collect { 
      it.isDirectory() ? it : zipTree(it) 
     } 
    } 
    with jarTask 
} 

configurations { 
    jarConfiguration 
} 

artifacts { 
    jarConfiguration jarTask 
} 

// This is the task that I call with ./gradlew to execute my jar 
task runMyJar(type: JavaExec) { 
    classpath files('build/libs/my-main-class-with-dependencies.jar') 
    main 'com.example.MyMainClass' 
    args = ["param1","param2"] 
    outputs.upToDateWhen { false } 
} 

runMyJar.dependsOn(createJarWithDependencies, build) 

我從下面的堆棧這些做法溢出答案/下面引用:然而,當我運行./gradlew clean runMyJar(甚至只是./gradlew runMyJar Android Studio export jar with dependencies Android studio - How to use an executable jar file from gradle

,我得到以下錯誤信息:

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

任何人都可以指出爲什麼我的可執行jar沒有找到我班裏的主要方法?有什麼我失蹤?

+0

您可以添加您的Main類嗎? –

+0

可能重複的[Gradle-沒有主清單屬性](https://stackoverflow.com/questions/32567167/gradle-no-main-manifest-attribute) – jrtapsell

+0

不完全是你的問題的答案,但看看https:/ /docs.gradle.org/current/userguide/application_plugin.html –

回答

0

既然我已經沒有多少運氣這個解決方案,我設法通過做來解決這個問題,而不是執行以下操作:

task deleteJar(type: Delete) { 
    delete 'libs/my-main-class.jar' 
} 

task createJar(type: Copy) { 
    from('build/intermediates/bundles/debug/') 
    into('libs/') 
    include('classes.jar') 
    rename('classes.jar', 'my-main-class.jar') 
} 

// This is the task that I call with ./gradlew to execute my jar 
task runMyJar(type: JavaExec) { 
    classpath files('libs/my-main-class.jar') 
    classpath files('libs/common-util.jar') 
    main 'com.example.MyMainClass' 
    args = ["param1","param2"] 
    outputs.upToDateWhen { false } 
} 

createJar.dependsOn(deleteJar, build) 
runMyJar.dependsOn(createJar, build) 

這不是我想要雖然,因爲這種做法沒有按解決方案不要從這個模塊引用的其他模塊中獲取依賴關係,這正是我試圖解決的問題。爲了做到這一點,我最終要做的是在這些「其他」模塊上覆制/粘貼相同的方法,併爲該模塊生成一個lib,然後將該lib複製到該模塊的libs文件夾中。或者我可以在這個相同的模塊中移動這些相關的代碼,所以我不必處理它。對於一個簡單的應用程序來說不算太糟糕(幸運的是,我的情況),但對於一個複雜的應用程序,我不確定如何去做。

作爲一個額外的參考這裏是我的依賴關係部分:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile project(':common-util') 
    // common-util is an Android module, which references other Android 
    // methods such as Log.d, android.util class methods, etc. 
} 

順便說一句,我使用的是Android Studio中的IntelliJ IDE這個(這是帖子的原始動機)。我希望不必從其他模塊中創建單獨的罐子,將其包含到該模塊中,而是一次完成所有工作。

相關問題