Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导:包含scanBasePackages的外部jar依赖项_Java_Spring_Spring Boot_Gradle_Dependency Injection - Fatal编程技术网

Java Spring引导:包含scanBasePackages的外部jar依赖项

Java Spring引导:包含scanBasePackages的外部jar依赖项,java,spring,spring-boot,gradle,dependency-injection,Java,Spring,Spring Boot,Gradle,Dependency Injection,我将首先描述这个问题,这里引用的文件可以在下面找到 我正在尝试使用jar文件形式的外部库。这个库包含我在Spring@配置文件中使用的代码。因此,我将其作为实现依赖项包含在我的build.gradle(参见下面的代码)中 所有库文件都包含在包com.rusticisoftware.tincan中。我自己的代码位于de.My.example下 将@SpringBootApplication保留为默认值(这与de.my.example相同,因为Application.java类在使用Gradlea

我将首先描述这个问题,这里引用的文件可以在下面找到


我正在尝试使用jar文件形式的外部库。这个库包含我在Spring
@配置文件中使用的代码。因此,我将其作为实现依赖项包含在我的
build.gradle
(参见下面的代码)中

所有库文件都包含在包
com.rusticisoftware.tincan
中。我自己的代码位于
de.My.example

@SpringBootApplication
保留为默认值(这与
de.my.example
相同,因为
Application.java
类在使用Gradle
assemble
任务组装项目时起作用。然后,我可以从我的IDE启动项目,一切都按预期工作

但是,无论是在运行Gradle
test
任务还是在执行由spring boot的
bootJar
任务创建的bootJar时,都会引发以下错误:

    java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:798
            Caused by: org.springframework.beans.factory.BeanCreationException at ConstructorResolver.java:656
                Caused by: org.springframework.beans.BeanInstantiationException at SimpleInstantiationStrategy.java:185
                    Caused by: java.lang.NoClassDefFoundError at Config.java:29
                        Caused by: java.lang.ClassNotFoundException at BuiltinClassLoader.java:581
其中,由以下原因引起的
:java.lang.NoClassDefFoundError at Config.java:29
在代码中引用了这一行:
RemoteLRS-lrs=new RemoteLRS();
RemoteLRS
com.rusticsoftware.tincan中包含的jar库中的类

我通过在
@springbootplication
注释中指定
scanBasePackages
来摆脱这个错误,如下所示:
@springbootplication(scanBasePackages={“com.rusticisoftware.tincan})
。但是,这样做将不再扫描并查找导致REST服务未加载的
MyResource.java

为了解决这个问题,我尝试将我自己的包与jar中的包一起手动添加到
@SpringBootApplication
,结果是:
@SpringBootApplication(scanBasePackages={“com.rusticsoftware.tincan”,“de.my.example”})

这将再次加载REST服务,但在运行
测试
任务或执行由
bootJar
任务生成的jar时遇到与以前相同的问题。我还手动检查了生成的bootJar,并可以确认库jar包含在其中


项目结构

Project
 |
 +-- build.gradle
 |    
 +-- src
 |    |
 |    +-- main/java/
 |    |        |  
 |    |        +-- de/my/example
 |    |                   |
 |    |                   +-- Application.java
 |    |                   |
 |    |                   +-- Config.java
 |    |                   |
 |    |                   +-- controller
 |    |                           |
 |    |                           +-- MyResource.java
 |    +-- test/java/
 |             |  
 |             +-- de/my/example
 |                        |
 |                        +-- ApplicationTests.java
 +-- libs
      |
      +-- tincan-1.1.0.jar

格雷德尔先生

plugins {
    id "java"
    id "idea"
    id 'org.springframework.boot' version '2.3.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
}

// project settings
group 'de.my.example'
version '1.0'
sourceCompatibility = 11

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // spring
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }

    // tin-can xAPI
    implementation files('libs/tincan-1.1.0.jar')
}

test {
    useJUnitPlatform()
}

Application.java

@SpringBootApplication(scanBasePackages = {"com.rusticisoftware.tincan", "de.my.example"})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

ApplicationTests.java

@SpringBootTest
class ApplicationTests {

    @Test
    void contextLoads() {
    }

}

TestResource.java

public class TestResource {

    private final LearningRecordStore learningRecordStore;

    public TestResource(LearningRecordStore learningRecordStore) {
        this.learningRecordStore = learningRecordStore;
    }

    @GetMapping(value = "/ping", produces = MediaType.TEXT_PLAIN_VALUE)
    public String ping() {
        return "pong";
    }
}

Config.java

@Configuration
public class Config {

    @Bean
    public LearningRecordStore learningData() {
        RemoteLRS lrs = new RemoteLRS();
        return new LearningRecordStore(lrs);
    }

}

最简单的检查方法是在Gradle build之后浏览生成文件,以确保它存在于生成包中。这样,您将确保它已被包含,并且不应引发class not found exception。此外,您可能需要在scanBasePackage中同时包含这两个包。

最简单的检查方法是在scanBasePackage之后浏览生成文件er Gradle build以确保它存在于构建包中。这样,您将确保它被包含,并且不应引发类未找到异常。此外,您可能需要将这两个包都包含在scanBasePackage中。

谢谢您的回答!如上所述,我已经查看了任务的输出。库存在。我还在
scanBasePackage
中包含了这两个包-如上所述,我得到的结果与根本不包含它们的结果相同。我认为这是Springs类路径和依赖关系管理的问题,而不是Gradle或Gradle任务的问题。感谢您的回答!如上所述,我已经查看了任务的输出。库Is现在。我也在
scanBasePackage
中包含了这两个包-如前所述,我得到的结果与根本不包含它们相同。我认为这是Springs类路径和依赖关系管理的问题,而不是Gradle或Gradle任务的问题。