【问题标题】:Gradle build dependancy throwing ClassNotFoundExceptionGradle构建依赖抛出ClassNotFoundException
【发布时间】:2014-05-19 14:57:57
【问题描述】:

我目前正在编写我的第一个 Gradle 构建脚本,以帮助构建一个简单的 Java 应用程序,以便从命令行使用。

下面是完整的 build.gradle 代码

apply plugin: 'java'
apply plugin: 'eclipse'

defaultTasks 'clean', 'build'

repositories {
    mavenCentral()
}

jar {
baseName = 'napier-deploy'
version =  '1'
manifest {attributes 'Main-Class': 'com.Main'}
}

dependencies {
    compile 'org.apache.httpcomponents:fluent-hc:4.3.3'
    compile 'org.apache.httpcomponents:httpclient-cache:4.3.3'
    compile 'org.apache.httpcomponents:httpcore:4.1'
    compile 'org.apache.httpcomponents:httpmime:4.3.3'
    compile 'org.apache.httpcomponents:httpclient:4.3.3'

    testCompile 'junit:junit:4.11'
    testCompile 'org.mockito:mockito-all:1.9.5'
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

运行 gradle assemble --info 命令显示从 Maven 下载的依赖项,但是当我尝试从命令行启动 Jar 时出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/HttpEntity
    at com.Main.main(Main.java:17)
Caused by: java.lang.ClassNotFoundException: org.apache.http.HttpEntity
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 1 more

HttpEntity 包含在 httpcomponents.httpcore 人工制品中,所以我不明白为什么 JVM 找不到类。

感谢任何 cmets。

【问题讨论】:

  • 听起来您在没有 Gradle 帮助的情况下启动应用程序,也没有提供类路径 (-cp)。
  • 生成的 jar 只包含你的类和你的类,而不是所有的依赖项。你需要一个插件,比如 gradle-fatjar-plugin
  • 谢谢大家,将添加一个 fatjar 任务

标签: java maven gradle dependency-management build.gradle


【解决方案1】:

由于运行时配置也包含编译配置,所以可以排除上面例子中收集编译配置的一段sn-p代码。

【讨论】:

    【解决方案2】:

    经过一番研究,我使用以下构建脚本成功构建了我的 Jar。

    apply plugin: 'java'
    apply plugin: 'eclipse'
    
    defaultTasks 'clean', 'build'
    
    repositories {
        mavenCentral()
    }
    
    jar {
        from {
            configurations.compile.collect {
                it.isDirectory() ? it : zipTree(it)
            }
            configurations.runtime.collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }
        manifest {
            attributes 'Implementation-Title': 'ndeploy',
                'Implementation-Version': '0.1.0',
                'Built-By': System.getProperty('user.name'),
                'Built-Date': new Date(),
                'Built-JDK': System.getProperty('java.version'),
                'Main-Class': 'com.Main'
        }
    }
    
    dependencies {
        compile 'org.apache.httpcomponents:fluent-hc:4.3.3'
        compile 'org.apache.httpcomponents:httpclient-cache:4.3.3'
        compile 'org.apache.httpcomponents:httpcore:4.1'
        compile 'org.apache.httpcomponents:httpmime:4.3.3'
        compile 'org.apache.httpcomponents:httpclient:4.3.3'
        testCompile 'junit:junit:4.11'
        testCompile 'org.mockito:mockito-all:1.9.5'
    }
    
    buildscript {
        dependencies {
            classpath fileTree(dir: '../../build/libs', include: '*.jar', excludes: ['*javadoc.jar', '*sources.jar'])
        }
    }
    

    评论赞赏

    【讨论】:

    • 您是否从 gradle 中检查了应用程序插件?如果您想从 cli 运行它,它可能非常有用。它提供了一个运行任务,可以运行你的 main
    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2019-09-09
    • 2013-01-30
    • 1970-01-01
    • 2015-11-30
    • 2016-05-30
    • 2016-11-23
    相关资源
    最近更新 更多