如何控制IntelliJ Scratch文件的依赖关系?

24

我有一个使用guava集合的草稿文件,我遇到了一些奇怪的错误,我不得不认为这是由于编辑器和实际运行环境假定不同版本的guava集合造成的:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.collect.Range.<init>(Lcom/google/common/collect/Cut;Lcom/google/common/collect/Cut;)V from class 
com.google.common.collect.Ranges
    at com.google.common.collect.Ranges.create(Ranges.java:80)
    at com.google.common.collect.Ranges.closedOpen(Ranges.java:114)
    at Scratch.main(scratch_2.java:69)

我并不能确定,因为我也不知道如何查看scratch文件正在使用的版本。我已完全从项目依赖项中删除了guava,但scratch文件仍然可以正常运行……为什么?这个库从哪里来的?

scratch run config

然而它仍然可以正常运行。我发现,如果我从本地ivy缓存中删除guava条目,它就无法运行。如果我再将guava添加回项目依赖项,则它会再次出现在我的ivy缓存中,即使我从项目依赖项中删除guava,scratch文件仍然可以正常工作。那么scratch文件只是随机选择一个版本还是怎么做的呢?ivy缓存位于~/.ivy2/cache/com.google.guava,看起来像这样:

ivy cache

但是还有一个名为“jars”的文件夹,其中某些原因包含guava-12.0:

other folder in ivy cache

我不知道正在使用哪个版本,或者缓存中为什么有这么多不同的版本。有什么想法吗?


你的项目类型是什么?你在新的简单项目中是否遇到了同样的问题? - y.bedrov
这是一个SBT项目,依赖项来自maven。即使IntelliJ在项目之间共享scratch文件,但在一个简单的新项目中,我无法访问guava,因此无法运行scratch文件。在这个新项目中,我的scratch正常工作(编辑器和运行时使用相同的库版本,所以现在我的东西可以工作了!),并且删除依赖项会立即使scratch文件无法运行,而不需要在缓存中混乱处理。因此,看起来我的问题是scratch文件系统仅限于此一个项目。很奇怪。不过还是谢谢提示,至少我现在可以运行这个东西了! - K. M
2个回答

34

我发现最简单的方式是在运行配置对话框中选择“使用现有项目模块的类路径”(已配置依赖项)。如果您想从项目中分离出一个功能,以便隔离地处理,但仍然使用已配置的依赖项,则此方法非常实用。


如果有人需要帮助的话,你可以轻松地将父项目的类路径用于Kotlin试验文件 - https://kotlinlang.org/docs/tutorials/quick-run.html(参见“使用模块的类路径”配置) - AbstractVoid
21
使用Java时,执行此操作时会出现“错误:找不到或无法加载主类Scratch”的错误提示。 - star4z
4
这并没有解决问题,但对于那些正在寻找绕过类路径配置的方法的人来说,我所做的是,仍然将scratch.java保留在它的文件夹中,当准备好时,我将其复制并粘贴到我将用于配置类路径的文件夹的根目录。在那里,它似乎可以正常工作并在类路径中找到类。我知道这不是很实用,但我只是想评论一下,因为它可能会解决某些人的问题。 - Cesar Zapata

0

我在PyCharm中遇到了类似的问题,但我已经解决了 - 所以你的情况可能会有所不同。原来项目窗口附加了一个Python虚拟环境作为默认环境(我在同一窗口中打开了多个项目 - 但显然第一个项目成为了默认环境)。

我深入研究了解释器列表,找到了我想要的那个,并编辑了它的属性,具体来说是将此虚拟环境与当前项目关联

我勾选了包含我要查找的库的virtualenv的框,这样就可以在编辑器本身中修复编译错误了。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接