Gradle-即使打包在jar中也无法加载Java类

时间:2019-07-13 13:17:31

标签: java gradle

我的gradle构建文件是

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building a CLI application
    id 'application'
}

apply plugin: 'java'
jar {
    from configurations.runtime
    manifest {
        attributes(
            'Created-By':'Gmack',
            'Main-Class':'myapprunner.App',
            'Class-Path':'mydaos-1.0.jar'
        )

    }

}

allprojects{

  repositories {
      jcenter()
  }
}

subprojects {
   version = '1.0'
   apply plugin: 'java'
}

dependencies {
    // This dependency is used by the application.
    implementation 'com.google.guava:guava:27.1-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'

    // Compile Project for dependency
    compile project(':mydaos')
}

application {
    // Define the main class for the application
    mainClassName = 'myapprunner.App'
}

当我使用java -jar myapprunner.jar

运行应用程序时

我得到一个ClassNotFoundException

Caused by: java.lang.ClassNotFoundException: com.mydaos.Library
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 1 more

我可以确认罐子已经装好了。不知道为什么这没把事情捡起来。

任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:1)

插件java被应用了两次,并且com.mydaos.Library很可能从compile project(':mydaos')(或'Class-Path':'mydaos-1.0.jar')中被拉出。假设项目没有建立或类路径错误。

答案 1 :(得分:0)

依赖项类(项目/外部jar)默认情况下不打包在jar中。

您正在使用应用程序插件,该插件将您的类,依赖项和执行脚本捆绑在zip中,因此您应该使用它。该插件还向您的项目添加了一个“运行”任务,以便通过gradle运行您的主类以进行开发。有关更多信息,请参见application plugin docs

如果要将依赖项打包到jar(称为uber jar)中,请参见here。我建议您停止使用应用程序插件

'Class-Path':'mydaos-1.0.jar'

这假设mydaos-1.0.jar与您正在运行的java -jar ...位于同一文件夹中,