下面是我的项目目录。我正在尝试使用Kitchen.jar(位于libs文件夹中)作为文件依赖项。
下面是我的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中的一类。
对于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显示类似的错误,如下所示。
我尝试通过“项目结构”窗口(请参见下文)手动将Kitchen.jar文件添加为依赖项,即使根据屏幕快照将Kitchen.jar文件添加为依赖项,上述错误仍然存在。
我也尝试过File-> Invalidating Caches / Restart;但是,这不能解决我的问题。
为什么我的Kitchen.jar文件中的所有类(例如“食物”)都没有在我的Gradle项目中注册?
编辑1:
我尝试了如下所示的0xadecimal解决方案,但不幸的是,它仍然无法编译,并且Intellij抛出了如下错误,即在Oven类中没有解析符号“ Food”,如下所示。
编辑2:
我已尝试在评论中使用LukasKörfer的建议来使用implementation files(...)
;但是,我仍然遇到编译错误,并且Intellij仍然对我大吼大叫(屏幕截图的右侧)。请注意,即使我将Intellij设置为在dependencies
文件更改时自动更新,我每次更改build.gradle文件时也要确保通过单击build.gradle
旁边的绿色按钮来运行依赖项。 。这意味着问题不应该是因为Intellij中的依赖项没有更新。
答案 0 :(得分:0)
我认为问题在于您正试图从命名包(Kitchen.jar
)中的类中导入未命名包中的类(Kitchen.App
中的任何类)。
Java不允许将默认(未命名)包中的类导入命名包-这是导致您看到的编译时错误的原因:
从Java Language Specification 7.5.1
类型必须是命名包的成员,或者是 类型,其最外面的词法包围类型声明(第8.1.3节)为 命名包的成员,或者发生编译时错误。
要解决此问题,您可以:
确保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'