我从另一个库导入一个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编辑器错误吗?
2条答案
按热度按时间vvppvyoh1#
像Tenfour 04-我想知道你是否有意在你自己的代码库中隐藏相同的包/类。这是非常危险的,因为你依赖于一些策略来让你的实现在编译后的代码中获胜--我认为类路径加载器是按照声明的顺序搜索的,但是大多数构建/运行工具都没有给予你声明顺序的选项,一旦你构建了一个类似于组合jar的东西(参见Maven Shade),谁知道呢。
不管怎样,回答你的问题…
我在一个复杂的依赖图中看到过类似的东西。我的问题是这样的:
然后
在这种情况下,依赖项管理器(在我们的例子中是Maven)忽略了更深层次的过时依赖项,所有这些都在运行时编辑器之外。但是IntelliJ不喜欢它,在某些情况下会给出基于编辑器的错误。
编辑器错误对我们来说只是 * 似乎 * 是围绕有“派生代码”的情况(在我们的情况下是Lombok),这是因为IntelliJ正在跟踪版本并认为存在冲突。
看起来版本跟踪聪明也在打击你。在你的项目中接受1个Java类作为这个区域的“桥梁”怎么样……尽管有那些关于“阴影”的警告。
切入点
另一种不同的方法是考虑使用面向方面编程来声明一个切入点,AOP框架将在其中 Package 您想要更改其行为的类。参见Spring's AOP implementation
9lowa7mx2#
我建议使用与最初编写阴影类相同的语言编写阴影类。如果这是Java,那就用Java编写代码。您的Kotlin编译器将选择它并将其与Kotlin源代码沿着编译。
这样,匹配原始类的布局就容易得多。从理论上讲,跨语言是可以正确地做到这一点的,但这是一个麻烦,你可以很容易地避免。