无法使用Gradle和Intellij

时间:2019-10-08 04:27:53

标签: java gradle dependencies build.gradle

下面是我的项目目录。我正在尝试使用Kitchen.jar(位于libs文件夹中)作为文件依赖项。

directory

下面是我的build.gradle文件,在其中我尝试将Kitchen.jar包含为依赖项。

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building a CLI application
    id 'application'
}

repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // This dependency is used by the application.
    implementation 'com.google.guava:guava:27.1-jre'

    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'

    compile files('libs/Kitchen.jar')
}

application {
    // Define the main class for the application
    mainClassName = 'Kitchen.App'
}

但是,当我运行gradle build时,出现以下错误,该错误告诉我Kitchen.jar文件未正确导入。 “食物”是Kitchen.jar中的一类。

enter image description here

对于insertFood方法的某些上下文,这是Oven类的样子。

package Kitchen;
/**
 * This class models an oven appliance for cooking food.
 */
public class Oven {
    private final int maxTemperature;
    private int currentTemperature = 0;

    /**
     * Creates an Oven object with a default maximum temperature of 320 degrees Celsius
     */
    public Oven() {
        this(320);
    }

    /**
     * Creates an Oven object with a specific maximum temperature
     *
     * @param maxTemperature The maximum temperature this oven can be set to. Cannot be a negative number.
     * @throws IllegalArgumentException If the maxTemperature is negative
     */
    public Oven(int maxTemperature) {
        if (maxTemperature < 0) {
            throw new IllegalArgumentException("Invalid temperature");
        }
        this.maxTemperature = maxTemperature;
    }

    /**
     * Sets the current temperature of the oven to the given value
     *
     * @param temperature The temperature to set in degrees Celsius
     * @throws IllegalArgumentException If the temperature is negative or higher than this oven's maximum temperature.
     */
    public void setTemperature(int temperature) {
        if (temperature < 0 || temperature > maxTemperature) {
            throw new IllegalArgumentException("Invalid temperature");
        }
        this.currentTemperature = temperature;
    }

    /**
     * Gets the current temperature (the oven has no heating or cooling times and changes temperatures instantly)
     * @return The current temperature in degrees Fahrenheit
     */
    public int getCurrentTemperature() {
        return (currentTemperature * 9/5) + 32;
    }

    /**
     * Gets the maximum temperature this oven can be set to
     * @return The max temperature in degrees Celsius
     */
    public int getMaxTemperature() {
        return maxTemperature;
    }

    /**
     * Adds an item of food to the oven, potentially changing its state.
     *
     * @param food The food to be added to the oven
     * @param duration The length of time in minutes the food will be in the oven for
     * @throws IllegalArgumentException If the food parameter is null, or if the duration is negative
     */
    public void insertFood(Food food, int duration) {
        if (null == food) {
            throw new IllegalArgumentException("Food may not be null");
        }
        if (duration < 0) {
            throw new IllegalArgumentException("Duration must be >= 0");
        }

        food.cook(currentTemperature, duration);
    }
}

同样,IDEA显示类似的错误,如下所示。

enter image description here

我尝试通过“项目结构”窗口(请参见下文)手动将Kitchen.jar文件添加为依赖项,即使根据屏幕快照将Kitchen.jar文件添加为依赖项,上述错误仍然存​​在。

enter image description here

我也尝试过File-> Invalidating Caches / Restart;但是,这不能解决我的问题。

为什么我的Kitchen.jar文件中的所有类(例如“食物”)都没有在我的Gradle项目中注册?

编辑1:

我尝试了如下所示的0xadecimal解决方案,但不幸的是,它仍然无法编译,并且Intellij抛出了如下错误,即在Oven类中没有解析符号“ Food”,如下所示。

enter image description here

编辑2:

我已尝试在评论中使用LukasKörfer的建议来使用implementation files(...);但是,我仍然遇到编译错误,并且Intellij仍然对我大吼大叫(屏幕截图的右侧)。请注意,即使我将Intellij设置为在dependencies文件更改时自动更新,我每次更改build.gradle文件时也要确保通过单击build.gradle旁边的绿色按钮来运行依赖项。 。这意味着问题不应该是因为Intellij中的依赖项没有更新。

enter image description here

1 个答案:

答案 0 :(得分:0)

我认为问题在于您正试图从命名包(Kitchen.jar)中的类中导入未命名包中的类(Kitchen.App中的任何类)。

Java不允许将默认(未命名)包中的类导入命名包-这是导致您看到的编译时错误的原因:

Java Language Specification 7.5.1

  

类型必须是命名包的成员,或者是   类型,其最外面的词法包围类型声明(第8.1.3节)为   命名包的成员,或者发生编译时错误。

要解决此问题,您可以:

  1. 确保Kitchen.jar中附带的代码属于命名包。如果JAR仅包含编译的类文件,而您无权访问源代码,那么这不是一个选择。如果您确实有权访问源代码并可以重建此JAR,则需要放置一个包结构,以使这些类不会全部位于JAR的根目录中,例如:

    home / util / AbstractFood.java

    home / util / Food.java

    home / util / Fries.java

    home / util / Kitchen.java

    home / util / Oven.java

    home / util / Potato.java

,每个文件的顶部带有package home.util;

然后您应该重建jar并使用App.javaOven.java等在import home.util.Kitchen;import home.util.Oven;中导入类。

  1. 将命名包(Kitchen)中的代码移动到默认(未命名)包中。这不是一个好主意-我们不应该在默认包中编写代码,但是如果您无法执行选项1,则这是您唯一的选择。这意味着将Java代码(App.java, Oven.java)移动到直接位于src/main/java目录中,并从这些文件的顶部删除所有package Kitchen声明。您还需要设置mainClassName = 'App'