有 Java 编程相关的问题?

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

JavaGradle:向JAR文件的类路径添加类

我希望标题本身是描述性的,但为了清楚起见,我试图在问候服务中包含一个jar(即错误处理服务.jar)。jar。在构建之后,我加入了问候服务。jar在新项目(即TestApplication)中,但在执行我得到的TestApplication时(顺便说一句,TestApplication不是gradle项目)

Exception in thread "main" java.lang.NoClassDefFoundError: co/common/exception/BaseException
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)

共同公司。例外BaseException是错误处理服务模块中的一个类

根据这里的question。我包括

manifest {
            attributes(
                    "Manifest-Version": "1.0",
                    "Class-Path": configurations.compile.collect { it.getName() }.join(' ')
            )
        }

这里是构建。依赖于错误处理服务的问候服务等级

buildscript {
    repositories {
        mavenCentral()
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'maven'

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    compile('org.apache.commons:commons-lang3:3.0')
    compile('org.apache.commons:commons-collections4:4.0')
    compile('org.slf4j:slf4j-api:1.7.25')
    compile('co.common:error-handling-service:1.0.0-SNAPSHOT')
    testCompile("org.mockito:mockito-all:1.9.5")
    testCompile('junit:junit:4.12')
}

jar {
    baseName = 'greeting-service'
    version = '1.0.0-SNAPSHOT'
    manifest {
        attributes(
                "Manifest-Version": "1.0",
                "Class-Path": configurations.compile.collect { it.getName() }.join(' ')
        )
    }
}

group = 'co.common'
version = '1.0.0-SNAPSHOT'

sourceCompatibility = 1.8
targetCompatibility = 1.8


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

在成功构建问候服务之后,我加入了问候服务。在TestApplication中,我仍然收到了上面提到的相同异常

Manifest-Version: 1.0
Class-Path: commons-lang3-3.0.jar commons-io-2.4.jar commons-collections
 4-4.0.jar slf4j-api-1.7.25.jar error-handling-service-1.0.0-SNAPSHOT.
 jar commons-logging-1.1.3.jar

为什么会发生这种情况,应该怎么做


共 (2) 个答案

  1. # 1 楼答案

    Java中的NoClassDefFoundError出现在Java虚拟机无法在运行时找到编译时可用的特定类时。例如,如果我们有一个类的方法调用或访问一个类的任何静态成员,而该类在运行时不可用,那么JVM将抛出NoClassDefFoundError

    因此,假设你的gradle构建成功通过——我可能会得出结论,你提供了错误的error-handling-service-1.0.0-SNAPSHOT.jar,它不包含co/common/exception/BaseException

    你应该仔细检查这个罐子的实际内容

  2. # 2 楼答案

    不确定这是否有帮助,但如果您的错误处理服务。jar已经打包好,可以作为一个依赖项包含到您的问候服务中。jar,那么你应该把它变成一个依赖项

    例如:

    1. 在项目中,创建一个名为“lib”的文件夹
    2. 添加错误处理服务。“lib”文件夹中的jar
    3. 将以下内容添加到依赖项块:

      依赖关系{ 编译文件树(目录:“lib”,包括:['*.jar']) ... }

    基本上,每一天。运行构建时,放入“lib”文件夹的jar将添加到应用程序jar中