gpt4 book ai didi

java - 无法使用 Gradle 和 Intellij 导入 jar 文件依赖项

转载 作者:行者123 更新时间:2023-12-01 23:34:35 43 4
gpt4 key购买 nike

下面是我的项目目录。我正在尝试使用 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 文件尚未正确导入。 “Food”是Kitchen.jar中的一个类。

这就是 Oven 类在 insertFood 的一些上下文中的样子。方法看起来像。

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 文件作为依赖项,即使根据屏幕截图将其添加为依赖项,上述错误仍然存​​在。

enter image description here

我还尝试过"file"->“使缓存无效/重新启动”;但是,这并不能解决我的问题。

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

编辑 1:

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

enter image description here

编辑2:

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

enter image description here

最佳答案

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

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

来自Java Language Specification 7.5.1

The type must be either a member of a named package, or a member of a type whose outermost lexically enclosing type declaration (§8.1.3) is a member of a named package, or a compile-time error occurs.

要解决此问题,您可以:

  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.java 中的类和Oven.java使用import home.util.Kitchen; , import home.util.Oven;

  • 将命名包 ( Kitchen ) 中的代码移至默认(未命名)包中。这不是一个好主意 - 我们不应该在默认包中编写代码,但如果您无法执行选项 1,这是您唯一的选择。这意味着将您的 java 代码 ( App.java, Oven.java ) 直接驻留在 src/main/java 中目录,并删除任何 package Kitchen这些文件顶部的声明。您还需要设置mainClassName = 'App'
  • 关于java - 无法使用 Gradle 和 Intellij 导入 jar 文件依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58280194/

    43 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com