从 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 启动时的运行方法