我在修改Minecraft,我导入了一个mod jar作为依赖项。但是,编译器提示错误,因为依赖项mod I中的类调用了其他mod中已实现接口的方法。
在我的代码中,我从依赖jar调用了一个类的方法。有一些简化的代码演示了代码是什么样的。
// From my mod
public class MachineIgniterListener {
public void onPlayerInteract(PlayerInteractEvent event) {
BaseMetaTileEntity tileEntity = getMachineInEventIfItIs(event);
if (tileEntity == null) return;
tileEntity.doEnergyExplosion();
}
}
其中BaseMetaTileEntity
来自dependency mod,它实现了其他mod的几个接口
// From dependency mod
public class BaseMetaTileEntity extends CommonMetaTileEntity
implements IActionHost, IAlignmentProvider, IConstructableProvider... {
public void doEnergyExplosion() {
// do some explosion
}
}
IActionHost
、IAlignmentProvider
和其他接口来自我没有包含在类路径中的其他mod,导致编译器抱怨
tileEntity.doEnergyExplosion();
^
class file for appeng.api.networking.security.IActionHost not found
我认为,就JVM字节码而言,代码不需要知道类实现了哪些接口来编译(这一点我可能是错的),所以我希望代码在没有将依赖的jar添加到类路径的情况下编译。但是,编译器要求所有jar都存在。由于我在Minecraft的遗留版本中编码,找到它需要的一些mod可能非常繁琐。
我使用Gradle将jar文件包含在我的项目中。由于我是Gradle的新手,我尝试了不同类型的依赖项配置,但没有一个能解决这个问题。
dependencies {
// compile files("dependency_mod.jar")
// implementation files("dependency_mod.jar")
// api files("dependency_mod.jar")
// runtimeOnly files("dependency_mod.jar") I can't even refer to the classes with this one
// Yes I tried lol
compileOnly files("dependency_mod.jar")
}
我想知道是否有方法可以使代码编译,而无需将所有这些jar添加到依赖项中。我的Gradle设置是否出错?或者除了加jar就没有别的办法了?
此外,如果这是相关的,我使用IntelliJ与Gradle 6。9.1、Java 8和FalsePattern / ExampleMod1.7.10修改工具链模板
另请参阅:所描述的导致预期行为的问题-Java Compiler transistive type checking behaviour
1条答案
按热度按时间2ul0zpep1#
我想知道是否有方法可以使代码编译,而无需将所有这些jar添加到依赖项中。
简短回答:可能不会,你必须添加所有的依赖项。
在Gradle文件中,您可以定义mod用来编译应用的库。Gradle接下来要做的是将所有这些类连接在一起,并构建类路径。Gradle能够从存储库(如maven's)中找到(并下载)所有 * 缺失 * 的依赖项。那里的包可以自己声明其他依赖项等等。
Gradle(以及构建工具)的优点是遍历那些复杂的依赖树,并获取每个项目需要/声明的jar。
在你的依赖中,你定义了一个本地jar依赖。这意味着你对Gradle说:
但是您的本地目录不是一个存储库,它不会告诉Gradle它需要哪些其他jar以及从那里转到哪里。
现在,它取决于您下载的jar文件,如果您的项目将编译。如果jar不包含它的依赖项,那么你必须自己找到这些额外的jar,下载它们并手动将它们添加到Gradle,这样它就会连接点并构建类路径。
但是检查是否有可能存在一个
dependency_mod.jar
,它在jar本身中包含了它的所有依赖项-通常称为fat or uber jar