首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复线程“主”java.lang.NoClassDefFoundError: com/itextpdf/text/DocumentException中的异常

问如何修复线程“主”java.lang.NoClassDefFoundError: com/itextpdf/text/DocumentException中的异常
EN

Stack Overflow用户
提问于 2017-02-23 07:55:09
回答 2查看 1.8K关注 0票数 0

我创建了一个控制台应用程序。这个应用程序可以生成一个pdf。我使用itextpdf。我添加了:

代码语言:javascript
复制
compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.10'

当我在命令行中启动程序时,我会看到一个日志:

代码语言:javascript
复制
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/itextpdf/text/DocumentException
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.privateGetMethodRecursive(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.itextpdf.text.DocumentException
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 7 more

当我在IntelliJ上启动我的应用程序时,它就能很好地工作。

build.gradle:

代码语言:javascript
复制
      group 'Harmonogramy'
version '1.0-SNAPSHOT'

task wrapper(type: Wrapper) {
  gradleVersion = '3.1'
  distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}

apply plugin: 'java'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
    compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.34'
    // https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils
    compile group: 'commons-dbutils', name: 'commons-dbutils', version: '1.6'
// https://mvnrepository.com/artifact/org.apache.commons/commons-csv
    compile group: 'org.apache.commons', name: 'commons-csv', version: '1.4'
    // https://mvnrepository.com/artifact/com.itextpdf/itextpdf
    compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.10'
// https://mvnrepository.com/artifact/net.sf.opencsv/opencsv
    compile group: 'net.sf.opencsv', name: 'opencsv', version: '2.3'

}

jar {
    archiveName = 'Harmonogramy.jar'

    manifest {
        attributes 'Main-Class': 'Main',
                'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
                'Implementation-Version': version
    }

    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) })
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-23 09:38:23

您需要用应用程序打包库,以使其可运行,并具有运行时所需的所有依赖项。例如在您的build.gradle中

在查看您的代码时,我感觉您没有遵循src/main/java结构,因此gradle不知道从哪里获取源文件,因为默认的是src/main/java。您可以修改SourceSets,但我建议您遵循结构惯例。

代码语言:javascript
复制
apply plugin: 'java'

sourceCompatibility = 1.5
targetCompatibility = 1.5

version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    compile 'mysql:mysql-connector-java:5.1.34'
    compile 'commons-dbutils:commons-dbutils:1.6'
    compile 'org.apache.commons:commons-csv:1.4'
    compile 'com.itextpdf:itextpdf:5.5.10'
    compile 'net.sf.opencsv:opencsv:2.3'
    testCompile 'junit:junit:4.11'
}

jar {
    archiveName = 'Harmonogramy.jar'

    manifest {
        attributes 'Main-Class': 'Main',
                'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
                'Implementation-Version': version
    }
    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) })
}

jar任务将扩展默认的gradle任务以构建jar,并将所有编译依赖项打包在其中--记住指出主类以使其可执行。

或者您可以尝试使用在这里找到的阴影插件https://github.com/johnrengelman/shadow

票数 1
EN

Stack Overflow用户

发布于 2017-02-23 08:01:59

控制台应用程序需要在运行时访问itext jar。IntelliJ自动提供该依赖项,但是如果您从控制台运行代码,则由您提供该依赖项。

你有两个主要选择

  • 用java -cp <path/to/itext.jar> yourprogram启动程序
  • 使用gradle构建一个"fat jar“并运行它( fat jar将您的代码及其所有依赖项打包到一个可执行的jar文件中)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42409981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档