简体   繁体   English

如何在运行 gradle compileJava 时修复相关子项目中的“找不到符号错误”

[英]How to fix “Cannot find symbol error” in related subproject while running gradle compileJava

I try to create a spring boot project with gradle using subprojects for different layers (web, business, dataAccess, common).我尝试使用 gradle 创建一个 spring 引导项目,并使用不同层的子项目(web、业务、dataAccess、common)。

I followed the instruction of the official gradle guide Creating Multi-Projects builds .我按照官方 gradle 指南Creating Multi-Projects builds的说明进行操作。

Both subprojects are create originally with Spring.io .这两个子项目最初都是使用Spring.io创建的。

Problem问题

I try to use my User class of the subproject common in my other subproject dataAccess .我尝试使用我的其他子项目dataAccess常见的子项目的User class 。 The import works fine in Intellij.导入在 Intellij 中运行良好。 However, when I run gradlew:dataAccess:compileJava the task fails because User cannot be found:但是,当我运行gradlew:dataAccess:compileJava任务失败,因为找不到User

Task:dataAccess:compileJava FAILED...\dataAccess\src\main\java\ch\wprogLK\MyProject\backend\dataAccess\MyProjectDataApplication.java:23: error: cannot find symbol User u = new User();任务:dataAccess:compileJava FAILED...\dataAccess\src\main\java\ch\wprogLK\MyProject\backend\dataAccess\MyProjectDataApplication.java:23:错误:找不到符号用户 u = new User(); ^ symbol: class User location: class MyProjectDataApplication) ^ 符号:class 用户位置:class MyProjectDataApplication)

The common project gets compiled before the dataAccess project.通用项目在dataAccess项目之前编译。 I guess it's a gradle configuration problem that the dataAccess project does not know anything about the common project at compilation time (maybe a classpath issue?).我猜这是一个 gradle 配置问题, dataAccess项目在编译时对common项目一无所知(可能是类路径问题?)。 I'm glad for any help.我很高兴有任何帮助。 Thanks.谢谢。

Project setup项目设置

  • MyProject我的项目
    • common常见的
      • src/main/java/ch/wprogLK/myProject/backend/common/entities src/main/java/ch/wprogLK/myProject/backend/common/entities
        • User.java用户.java
      • build.gradle build.gradle
      • settings.gradle设置.gradle
    • dataAccess数据访问
      • src/main/java/ch/wprogLK/myProject/backend/dataAccess src/main/java/ch/wprogLK/myProject/backend/dataAccess
        • AcLuDataApplication.java AcLuDataApplication.java
      • build.gradle build.gradle
      • settings.gradle设置.gradle
    • build.gradle build.gradle
    • settings.gradle设置.gradle

Code代码

MyProject /build.gradle我的项目/build.gradle

plugins {
    id 'org.springframework.boot' version '2.1.8.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

group = 'ch.wprogLK'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

allprojects {
    apply plugin: 'java' 
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

MyProject /settings.gradle我的项目 /settings.gradle

rootProject.name = 'MyProject'

include 'common'
include 'dataAccess'

MyProject/ common /build.gradle项目/common/build.gradle

plugins {
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
    id 'java'
}

group = 'ch.wprogLK'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
}

MyProject/ common /settings.gradle MyProject/ common /settings.gradle

rootProject.name = 'common'

MyProject/ common /src/main/java/ch/wprogLK/myProject/backend/common/entities/User.java MyProject/ common /src/main/java/ch/wprogLK/myProject/backend/common/entities/User.java

package ch.wprogLK.myProject.backend.common.entities;
public class User
{
    private Long userId;
    private String username;
}

MyProject/ dataAccess /build.gradle MyProject/数据访问/build.gradle

plugins {
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
    id 'java'
}

group = 'ch.wprogLK'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    compile project(":common")
}

MyProject/ dataAccess /settings.gradle MyProject/ dataAccess /settings.gradle

rootProject.name = 'dataAccess'

MyProject/ dataAccess /src/main/java/ch/wprogLK/myProject/backend/dataAccess/MyProjectDataApplication.java MyProject/ dataAccess /src/main/java/ch/wprogLK/myProject/backend/dataAccess/MyProjectDataApplication.java

package ch.wprogLK.myProject.backend.dataAccess;
import ch.wprogLK.myProject.backend.common.entities.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyProjectDataApplication 
{
    public static void main(String[] args)
    {
        SpringApplication.run(MyProjectDataApplication.class, args);
    }

    public MyProjectDataApplication()
    {
        User u = new User(); //This line is the problem when running gradle :dataAccess:javaCompile
    }
}

It is missing to set two configurations in order to indicate that common is a library.缺少设置两个配置以表明common是一个库。 So add the following configuration and compile , run from root of project.所以添加以下配置并compile ,从项目的根目录run

common build.gradle

bootJar {
    enabled = false
}

jar {
    enabled = true
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM