Java Gradle 构建 : NoClassDefFoundError

标签 java heroku gradle build dependencies

我的build.gradle文件如下

apply plugin: 'java' sourceCompatibility = 1.8

repositories {
    mavenCentral() }


dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile 'io.javalin:javalin:1.3.0'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4'
    compile 'org.slf4j:slf4j-simple:1.7.25' }

jar {
    manifest {
        attributes(
                'Class-Path': configurations.runtime.files.collect {"$it.name"}.join(' '),
                'Main-Class': 'products.ProductAPI'
        )
    } }

task stage {
    dependsOn 'build'
    dependsOn 'clean'
    build.mustRunAfter clean }

尝试使用 gradle 构建 java 应用程序并将其部署到 heroku 服务器。我在 java -jar build/libs/MyApp-0.0.1.jar 上遇到一些问题,因为它返回以下内容:

Exception in thread "main" java.lang.NoClassDefFoundError: io/javalin/Javalin at products.ProductAPI.main(ProductAPI.java:7) Caused by: java.lang.ClassNotFoundException: io.javalin.Javalin at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

最佳答案

要在没有任何 NoClassDefFoundError 的情况下运行您的应用程序,您应该在运行时类路径中拥有您的依赖项。创建一个 fat jar 是最简单的解决方案。像下面这样更改您的 jar 部分;

jar {
    manifest {
       attributes(
          'Class-Path': configurations.compile.files.collect {"$it.name"}.join(' '),
          'Main-Class': 'products.ProductAPI')}
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

运行 gradle build 命令,将创建具有依赖项的 jar。 其他方法是将 jar 添加到运行时类路径;使用 java -cp 标志。 (此外,如果您的应用程序已经配置了类路径文件夹,则复制此文件夹中的依赖项会将它们添加到类路径中)

关于Java Gradle 构建 : NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49114170/

相关文章:

java - 使用 yguard 时出现 IllegalStateException : Unable to open nested entry 'BOOT-INF/lib/xxx.jar' .

android - 单元测试不适用于 Android Studio 北极狐

java - 无法将“导出”识别为内部或外部命令,

java - Spring 3.0——无法为 XML 模式 namespace 上下文找到 Spring NamespaceHandler

没有 'www' 前缀, meteor 链接不起作用

ruby-on-rails - Ruby on Rails JPEG 转 PDF

build - gradle:在禁用某些测试的情况下聚合多项目testReport

java - 当我不使用 Firebase 身份验证时,如何使用 Cloud Firestore 中的 SharedPreferences 保存用户 session ?

java - Quartz 调度程序和 NextFireTime

ios - iOS 如何在 NSURLRequests 中设置 X-Forwarded-For header ?