我遇到了使用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可能更容易解决问题。

广告
将在 10 秒后关闭
bannerAds