IntelliJ Gradle 导入打破了模块结构

问题描述 投票:0回答:1

我看过有关此主题的其他帖子,但他们没有回答我的问题,所以我自己发表一个帖子。

IntelliJ 自动导入 Gradle 项目并创建具有自己的模块结构的 IntelliJ 项目。然而,它的方式破坏了遗留代码(尤其是我的大学提供的代码)。让我给你举个例子:

Gradle Auto-import

这是我所在大学的入门项目之一,所以规模相当小。据我所知,他们对项目使用标准的 Gradle 目录结构。所有这些带有

package main.java
的类都使用 Gradle 进行编译并按预期工作。然而,IntelliJ 导入项目的方式,它认为我的类被破坏了。

我必须手动修复此问题,方法是删除模块,将所有依赖项转移到主项目模块,并将

src/main/java
标记为源根:

The project structure that I want

神奇的是,所有错误都消失了,我可以自由编码并使用 IDE/Gradle 进行编译,没有任何问题。然而,有时我需要向 Gradle 文件等添加更多依赖项,这意味着我需要在 IDE 中刷新它 - 这会导致灾难性的自动导入。

所以我有以下问题:

  • 我的项目结构有问题吗?
  • 如果是上述情况,我是否应该使用一些“新”框架?
  • 否则,有什么方法可以让 IntelliJ 以理智的方式运行,这样我就不会在每次想向 Gradle 文件添加内容时浪费时间来更改项目结构?
java gradle intellij-idea
1个回答
0
投票

您的第一个屏幕截图表明,根据文件夹的图标,IntelliJ 认为

src/main/java
是 Gradle 配置的源根目录。 这与 Gradle 使用的传统目录布局相匹配。请注意,这意味着
src
main
java
not 包。直接位于
java
文件夹中的任何类型都位于“未命名”包中。因此,如果您的 Gradle 项目使用
src/main/java
作为源根,那么您的任何类都不应该有 package 语句,更不用说将包声明为
main.java

您的第二个屏幕截图再次基于文件夹的图标表明您告诉 IntelliJ 使用

src
作为源根目录(而不是您声称的
src/main/java
)。这确实使
main.java
成为一个包。如果
src
应该是源根目录,那么在
build.gradle
文件中应该有类似以下内容:

sourceSets {
  main {
    java.srcDirs = ['src']
  }
}

如果您没有(或类似的),那么所有

package main.java
语句都是不正确的,IntelliJ 实际上正在正确导入项目。至于为什么Gradle在没有上述
sourceSets
配置的情况下仍然能够编译项目,那是因为Java编译器并不真正关心包结构是否与目录结构匹配,至少当所有需要的源文件都传递给它(这就是 Gradle 在幕后所做的事情)。然而,IntelliJ 发现包和目录结构不匹配,因此会抱怨。

简而言之,根据您提供的信息,存在三种可能的情况:

  1. IntelliJ 正在正确导入项目,但您的源文件有错误的

    package main.java
    语句。

  2. IntelliJ 正在正确导入项目,但您的

    build.gradle
    文件缺少上面显示的源目录配置。

  3. IntelliJ 正在正确导入项目,但您的源文件应位于

    src/main/java/main/java
    下。开始的
    src/main/java
    部分将是源根,随后的
    main/java
    部分将是包。在我看来,这是三种情况中最不可能发生的情况。

我猜第一种情况就是发生的情况,特别是因为

main.java
是一个非常不寻常的包名称。也许编写代码的人并不理解 Gradle 的源代码组织和 Java 包如何交互。或者他们用来编写代码的代码编辑器可能无法将该项目识别为 Gradle 项目,并错误地认为
src
是源根(并且由于代码仍将通过 Gradle 进行编译,因此程序员没有意识到这个错误).

如果您希望 Gradle 和 IntelliJ 以相同的方式查看项目,那么您应该 (1) 删除所有

package
语句或 (2) 将上述配置添加到您的
build.gradle
文件中。

© www.soinside.com 2019 - 2024. All rights reserved.