有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Intellij IDE中,特别是Android Studio中,如何创建并运行具有依赖项的可执行jar?

我试图通过gradle创建并运行一个可执行jar。这就是我现在的gradle的样子:

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)

我从下面的堆栈溢出答案/参考中获得了这些方法: Android Studio export jar with dependencies Android studio - How to use an executable jar file from gradle

但是,当我运行./gradlew clean runMyJar(甚至只是./gradlew runMyJar)时,会收到以下错误消息:

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

有人能指出我的可执行jar在类中找不到主方法的原因吗?我有什么遗漏吗


共 (1) 个答案

  1. # 1 楼答案

    由于我在这个解决方案上运气不太好,所以我通过执行以下操作来解决这个问题:

    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)
    

    但这不是我想要的解决方案,因为这种方法不会从这个模块引用的其他模块中提取依赖项,这正是我试图解决的问题。为了做到这一点,我最终要做的是在那些“其他”模块上复制/粘贴相同的方法,并为该模块生成一个库,然后将该库复制到该模块的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来实现这一点(这是我发帖的最初动机)。我的希望是不必创建与其他模块不同的JAR来将其包含到这个模块中,而是一次完成所有工作