我遇到了使用Intellij 2017.2 + Gradle + doma-spring-boot-starter时遇到的问题
免责声明
我还没有完全理解原因,但是为了帮助困扰的人,我将公开。
我想做的事情 (Wǒ zuò de
我想用Gradle实现一个使用Maven编写的doma-spring-boot-starter教程。
环境
-
- IntelliJ IDEA 2017.2.4
-
- JDK 1.8
- Gradle 3.5.1
做过的事情 (zuò guò de shì
-
- IntelliJ から Spring Initializr を使ってプロジェクト初期化
Web, JDBC, H2 にチェック
build.gradle に doma-spring-boot-starter を追加
compile(‘org.seasar.doma.boot:doma-spring-boot-starter:1.1.1’)
build.gradle に Doma ドキュメント にある記述を追加
最終的なbuild.gradleは↓の方にあります
IntelliJ の Doma Plugin をインストール
あとはチュートリアル通りにクラスなどを作成
一种表现现象:在编辑器中显示出红色线条。
在定义ReservationDao字段时会显示错误。这在Maven中也是一样的。
@SpringBootApplication
@RestController
public class DomaGradleApplication {
@Autowired
public ReservationDao reservationDao;
//=> Could not autowire. No beans of 'ReservationDao' type found.
...
}
这个问题可能是IntelliJ的一个bug。
在这篇文章中写了很多解决方案,但是注意有些是适用于不同版本的,或者是一些权宜之计,所以需要注意。
由于在运行时没有问题,所以我决定先捐款并等待修复。
上瘾2:无法生成Doma类。
当我使用IntelliJ的Run按钮执行时,构建成功,但由于以下错误,服务器启动失败。
***************************
APPLICATION FAILED TO START
***************************
Description:
Field reservationDao in com.example.domagradle.DomaGradleApplication required a bean of type 'com.example.domagradle.ReservationDao' that could not be found.
Action:
Consider defining a bean of type 'com.example.domagradle.ReservationDao' in your configuration.
顺便提一句,如果使用构造函数注入来重写,Description 将如下所示。
Description:
Parameter 0 of constructor in com.example.domagradle.DomaGradleApplication required a bean of type 'com.example.domagradle.ReservationDao' that could not be found.
引起这个结果的因素是什么?
当查看out文件夹的内容时,发现应该由Doma生成的ReservationDao实现类不存在。在当前情况下,“a bean of type ‘…ReservationDao’”表示无法找到这个实现类。
解决方案
尽管我仍未理解为何无法生成,但当我使用gradlew时,注意到可以生成。
$ ./gradlew build
通过这样做,将会创建一个新的build文件夹,并在其中生成所需的类文件和jar文件。执行jar文件以启动服务器。
$ java -jar ./build/libs/***.jar
只是,用这种方法无法使用IntelliJ进行调试。
经过查询,通过在build.gradle文件中添加设置可以使其工作。
https://stackoverflow.com/questions/45174989/building-with-intellij-2017-2-out-directory-duplicates-files-in-build-director
实际上,通过将allprojects {…}放在buildscript{…}之后,确保了正常运行。为了方便起见,以下是完整的build.gradle内容。
buildscript {
ext {
springBootVersion = '1.5.7.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
// https://stackoverflow.com/questions/45174989/building-with-intellij-2017-2-out-directory-duplicates-files-in-build-director
allprojects {
apply plugin: 'idea'
idea {
module {
outputDir file('build/classes/main')
testOutputDir file('build/classes/test')
}
}
if(project.convention.findPlugin(JavaPluginConvention)) {
// Change the output directory for the main and test source sets back to the old path
sourceSets.main.output.classesDir = new File(buildDir, "classes/main")
sourceSets.test.output.classesDir = new File(buildDir, "classes/test")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
// JavaクラスとSQLファイルの出力先ディレクトリを同じにする
processResources.destinationDir = compileJava.destinationDir
// コンパイルより前にSQLファイルを出力先ディレクトリにコピーするために依存関係を逆転する
compileJava.dependsOn processResources
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.seasar.doma.boot:doma-spring-boot-starter:1.1.1')
runtime('com.h2database:h2')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
请注意,如果您更改了DAO或.sql文件,则需要再次运行./gradle build。
最后
我认为用Maven可能更容易解决问题。