如何使Java编译器忽略依赖类实现的不存在的接口?

wvt8vs2t  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(161)

我在修改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
    }
}

IActionHostIAlignmentProvider和其他接口来自我没有包含在类路径中的其他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

2ul0zpep

2ul0zpep1#

我想知道是否有方法可以使代码编译,而无需将所有这些jar添加到依赖项中。
简短回答:可能不会,你必须添加所有的依赖项。
在Gradle文件中,您可以定义mod用来编译应用的库。Gradle接下来要做的是将所有这些类连接在一起,并构建类路径。Gradle能够从存储库(如maven's)中找到(并下载)所有 * 缺失 * 的依赖项。那里的包可以自己声明其他依赖项等等。
Gradle(以及构建工具)的优点是遍历那些复杂的依赖树,并获取每个项目需要/声明的jar。
在你的依赖中,你定义了一个本地jar依赖。这意味着你对Gradle说:

  • 不要查看远程存储库来获取jar,但我已经在本地目录中为您准备好了

但是您的本地目录不是一个存储库,它不会告诉Gradle它需要哪些其他jar以及从那里转到哪里。
现在,它取决于您下载的jar文件,如果您的项目将编译。如果jar不包含它的依赖项,那么你必须自己找到这些额外的jar,下载它们并手动将它们添加到Gradle,这样它就会连接点并构建类路径。
但是检查是否有可能存在一个dependency_mod.jar,它在jar本身中包含了它的所有依赖项-通常称为fat or uber jar

相关问题