Intellij Idea IntelliJKotlin类路径:无法访问类

kb5ga3dv  于 2023-05-16  发布在  Kotlin
关注(0)|答案(2)|浏览(174)

我从另一个库导入一个jar,并直接在我的源代码中覆盖其中一个类(请不要判断),方法是在同一个包中声明相同的类名,并依赖于类路径优先级。
当这样做时,代码运行良好(mvn和IntelliJ),如果我编码到的类是java,那么即使IntelliJ编辑器也会很高兴。但是如果我用Kotlin编写类,我会得到:

Cannot access class 'com.****.raptor.gen.models.TextualEntry'. Check your module classpath for missing or conflicting dependencies

我无法用任何随机库复制它,只能用我们的内部库。
我的代码或多或少是这样的:
pom.xml:

<dependency>
      <groupId>com.****.logistics.gpltconfig</groupId>
      <artifactId>entities-java</artifactId>
      <version>1.0.4-RELEASE</version>
    </dependency>

这段java代码运行并显示在编辑器中:

CustomsForm customsForm = new CustomsForm();
    customsForm.setDeclaredItemPrice(new TextualEntry<>());
    System.out.println("done java");

但是这段Kotlin代码运行正常,但在编辑器中显示错误:

val customsForm = CustomsForm()
    customsForm.declaredItemPrice = TextualEntry<String>()
    println("done kotlin")

有什么建议可以帮助你摆脱Kotlin中的IntelliJ编辑器错误吗?

vvppvyoh

vvppvyoh1#

像Tenfour 04-我想知道你是否有意在你自己的代码库中隐藏相同的包/类。这是非常危险的,因为你依赖于一些策略来让你的实现在编译后的代码中获胜--我认为类路径加载器是按照声明的顺序搜索的,但是大多数构建/运行工具都没有给予你声明顺序的选项,一旦你构建了一个类似于组合jar的东西(参见Maven Shade),谁知道呢。
不管怎样,回答你的问题…
我在一个复杂的依赖图中看到过类似的东西。我的问题是这样的:

  • 项目1,模块A,打包为版本p1 a-1.0.1
  • 项目2,取决于p1 a-1.0.1,打包为版本p2-2.0.0

然后

  • 项目% 1已将所有版本移动到p1 xx-1.0.2,因此
  • 项目1,模块A,打包为版本p1 a-1.0.2
  • 项目1的模块B依赖于项目2,项目2依赖于p2-2.0.0,而p2-2.0.0又依赖于旧版p1 a-1.0.1

在这种情况下,依赖项管理器(在我们的例子中是Maven)忽略了更深层次的过时依赖项,所有这些都在运行时编辑器之外。但是IntelliJ不喜欢它,在某些情况下会给出基于编辑器的错误。
编辑器错误对我们来说只是 * 似乎 * 是围绕有“派生代码”的情况(在我们的情况下是Lombok),这是因为IntelliJ正在跟踪版本并认为存在冲突。
看起来版本跟踪聪明也在打击你。在你的项目中接受1个Java类作为这个区域的“桥梁”怎么样……尽管有那些关于“阴影”的警告。

切入点

另一种不同的方法是考虑使用面向方面编程来声明一个切入点,AOP框架将在其中 Package 您想要更改其行为的类。参见Spring's AOP implementation

9lowa7mx

9lowa7mx2#

我建议使用与最初编写阴影类相同的语言编写阴影类。如果这是Java,那就用Java编写代码。您的Kotlin编译器将选择它并将其与Kotlin源代码沿着编译。
这样,匹配原始类的布局就容易得多。从理论上讲,跨语言是可以正确地做到这一点的,但这是一个麻烦,你可以很容易地避免。

相关问题