从 cmd 运行时的 Spring Boot 负载测试数据库

Posted

技术标签:

【中文标题】从 cmd 运行时的 Spring Boot 负载测试数据库【英文标题】:Spring boot load test database when run from cmd 【发布时间】:2016-09-20 17:06:24 【问题描述】:

我有一个 spring boot 项目,当从 Eclipse 启动时使用 postgres 正确加载,但是当由 windows 命令窗口启动时,会加载测试数据库。

当我使用 java -jar happy_list-0.1.0.jar 从 cmd 启动应用程序时,出现此错误(我删除了部分堆栈跟踪):

原因:java.lang.IllegalStateException:测试数据库的驱动程序 类型 [HSQL] 在类路径中不可用 引起:java.lang.ClassNotFoundException: org.hsqldb.jdbcDriver

我没有任何测试或测试配置。它必须是 Spring boot 完成的一些自动配置,但我不明白为什么它在从 eclipse 或 windows cmd 运行时表现不同。

持久化上下文:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages =  "happy_listing" )
public class PersistentContext 


App.java:

@SpringBootApplication
@EnableAutoConfiguration
@Configuration
@ComponentScan(basePackages =  "happy_listing" )
@Import( PersistentContext.class )
public class App 

    @Configuration
    @PropertySource("classpath:application.properties")
    static class ApplicationProperties 
    

    public static void main(String... args) 
        SpringApplication.run(App.class, args);
    


构建.gradle:

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE")
        classpath('se.transmode.gradle:gradle-docker:1.2')
    


group = 'marcandregirard'

apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'docker'

jar 
    baseName = 'happy_list'
    version =  '0.1.0'


springBoot 
  mainClass = "happy_listing.App"

repositories 
    mavenCentral()


dependencies 
    compile 'org.slf4j:slf4j-api:1.7.13'
    compile 'javax.ws.rs:javax.ws.rs-api:2.0'
    compile 'org.springframework:spring-core'
    compile 'org.springframework:spring-context'
    compile 'org.springframework:spring-jdbc'
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.1.1'
    compile 'org.springframework.data:spring-data-jpa:1.9.2.RELEASE'
    compile 'org.hibernate:hibernate-entitymanager'
    compile 'org.postgresql:postgresql:9.4-1206-jdbc42'
    compile 'org.springframework:spring-web'
    testCompile 'junit:junit:4.12'


task buildDocker(type: Docker, dependsOn: build) 
  push = true
  applicationName = jar.baseName
  dockerfile = file('src/main/docker/Dockerfile')
  doFirst 
    copy 
      from jar
      into stageDir
    
  

我使用命令 gradle build buildDocker 创建了 jar,该命令创建了要在 Docker 中运行的 jar 和映像。

从 Eclipse 启动时一切正常。

【问题讨论】:

如果您需要任何其他信息或有不正确之处,请在 cmets 中说明。 还要确保您的 jar 旁边的配置文件夹中没有外部 application.properties 或其他内容。 【参考方案1】:

对于初学者,我会开始清理你的依赖项,而不是所有单独的 jar 文件都使用适当的启动器。

dependencies 
    compile 'javax.ws.rs:javax.ws.rs-api:2.0'
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.1.1'
    compile 'org.postgresql:postgresql:9.4-1206-jdbc42'
    testCompile 'org.springframework.boot:spring-boot-starter-test'

接下来看起来您正在尝试进行大量手动配置@SpringBootApplication 已经暗示了其他 3 个并且 Spring Boot 已经加载了application.properties。删除那个

@SpringBootApplication
public class App 

    public static void main(String... args) 
        SpringApplication.run(App.class, args);
    


删除您的 PersistenceContext 类,因为 Spring Boot 已经为您完成了。

清理完你的类和依赖项后,确保没有遗留旧类。为此,执行 Gradle clean 任务。 gradle clean 应该可以解决问题。

因此,在删除类时,还要确保使用 gradle clean build 而不是普通的 gradle build

【讨论】:

感谢您的清理工作,一切仍在 Eclipse 中运行,而且干净多了。问题仍然存在您需要更多信息吗? 如评论中所述,检查您的application.properties 以及您的环境变量中可能触发此行为的属性。 Spring Boot 从特定位置加载 application.properties 奇怪,在 jar 中我的配置包中添加了一个类 DataBaseConfig 但我在 eclipse 的项目中没有它,这可能是问题吗? 可以啊,你怎么还有这样的课? Spring Boot 只需要在 application.properties 中进行配置即可配置数据源。正如我在某处提到的那样,您似乎试图自己配置太多。 我不知道为什么,但是我的 jar 中有一些在我的项目中不存在的类。我不知道构建的哪个步骤包含或创建,但还有一个 HelloWorld 类仍然不存在......

以上是关于从 cmd 运行时的 Spring Boot 负载测试数据库的主要内容,如果未能解决你的问题,请参考以下文章

企业级spring-boot案例-Spring Boot 启动时的运行方法

企业级spring-boot案例-Spring Boot 启动时的运行方法

企业级spring-boot案例-Spring Boot 启动时的运行方法

企业级spring-boot案例-Spring Boot 启动时的运行方法

Spring Boot 在命令行指定主类启动程序

如何从父目录执行spring boot模块?