平台:IntelliJ社区版10.0.3 SDK: jdk1.6.0_21 操作系统:Windows 7

所以我有一个奇怪的IntelliJ情况,让我完全难住了。我设置了一个Maven项目,并将log4j作为依赖项添加到pom.xml文件中。IDEA检查运行良好,我的单元测试全部编译并运行。

然后,我使用mvn install:install-file将hunnysoft的jmime库添加到我的本地maven存储库,如下所示。

mvn install:install-file -Dfile=jmime.jar -DgroupId=jmime \
-DartifactId=jmime -Dversion=3.1.1e -Dpackaging=jar

Maven将jar文件安装到我的本地存储库中。

然后进入IntelliJ的Settings => Maven => Repository Services并更新我的本地存储库(以便IntelliJ将重新索引存储库内容)。

最后,我将以下依赖项添加到pom.xml文件中(就在log4j依赖项的上面)。

<dependency>
    <groupId>jmime</groupId>
    <artifactId>jmime</artifactId>
    <version>3.1.1e</version>
</dependency>

我现在创建一个新类,如下所示:

package com.stackoverflow.question;

import org.apache.log4j.Logger;
import com.hunnysoft.jmime.ByteString;
import com.hunnysoft.jmime.Field;
import com.hunnysoft.jmime.FieldBody;

public class StackOverflowQuestion {
    public Field create(String name, String text) {
        Logger.getLogger(getClass()).debug("create entered");
        FieldBody body = new FieldBody();
        body.setText(new ByteString(text));
        Field field = new Field();
        field.setFieldName(name);
        field.setFieldBody(body);
        return field;
    }
}

现在说说奇怪的地方。IntelliJ的意图机制可以很好地拾取和识别maven pom文件中的Logger导入。然而,对于所有hunnysoft导入它报告:“不能解析符号'ByteString/Field/FieldBody'”,BUT Build => Compile 'StackOverflowQuestion.java'正确编译一切,我为这个类创建的单元测试运行良好(尽管意图标记调用create()作为一个问题区域太)。

IntelliJ忽略了意图子系统的jmime.jar文件。我很困惑,因为log4j依赖项工作得很好,所有东西都编译和运行得很好。F12(“Go To Declaration”)在Logger导入上有效,但在所有jmime导入上失效。

哦,还有一件事,如果我转到“项目”窗口的“包”视图,“com.hunnysoft”。出现了“jmime”包,我可以在“Libraries”下面看到我在上面的代码片段中导入的所有类。从pom.xml文件中删除上述依赖项将导致该包消失,编译中断。

似乎检查的类路径被破坏了,但在Settings => Intentions | Compiler区域中似乎没有对此进行设置(并不是说我期望有这样的设置,我相信IDEA应该已经知道基于pom文件和JDK的正确类路径)。

作为最后的实验,我创建了一个全新的标准J2SE应用程序项目(没有使用maven),并将jmime.jar文件直接添加到项目中作为其库之一。在这个新项目中,我遇到了与上面描述的完全相同的问题。

这是舱单。MF来自jmime jar文件。

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.5.4
Created-By: 10.0-b23 (Sun Microsystems Inc.)

Name: com/hunnysoft/jmime/
Sealed: true
Specification-Title: Hunny JMIME
Specification-Version: 3.1.1
Specification-Vendor: Hunny Software, Inc.
Implementation-Title: com.hunnysoft.jmime
Implementation-Version: 3.1.1E
Implementation-Vendor: Hunny Software, Inc.

我在这个罐子文件里没发现什么异常。

我最好的猜测是,这个问题可能是一个缺失的依赖问题。但是AFAIK jmime应该是自包含的(JarAnalyzer不会提供任何东西,但我不确定如果缺少一个依赖jar,它是否会提供任何东西)。

有人有什么想法吗?


当前回答

导入标准java库(如java.beans.*)时遇到问题

通过将其指向正确的JRE路径,在我的Redhat 7系统上修复了它。

文件- > ProjectStructure - > sdk - > 1.8 更改“JDK主路径:”为/usr/lib/jvm/java-1.8.0-openjdk-1.8.0161-2.b14.el7。而不是/usr/lib/jvm/java-1.8.0-openjdk-1.8.0161-2.b14.el7_4.x86_64

jdk的前一个路径(路径中有_4的差异)几乎没有任何内容。它缺少许多java库。

其他回答

这在这个问题的另一个答案中提到过,但这一个答案就解决了这个问题。我在IntelliJ之外的一个单独的终端上完成所有的构建。因此,缓存需要设置适当的权限,以便IntelliJ应用程序读取它们。

从项目的根文件夹运行它。

$ mvn -U idea:idea

如果我所有的pom.xml文件都配置正确,并且IntelliJ中的Maven仍然存在问题,我将执行以下步骤

Read how to use maven in IntelliJ lately Make sure IntelliJ is configured to use Bundled Maven 3 Find and TERMINATE actual java process that is executing Maven 3 repos indexing for IntelliJ(Termination can be done while IntelliJ is running). In case any problems with indices or dependencies not available(thought repositories were configured in pom.xml). Forced Update for all repositories in "IntelliJ / Settings / Build Tools / Maven / Repositories / ". Takes most of the time, disk space and bandwidth! Took me 20+ minutes to update index for Maven central repo. Hit Re-import all Maven project once again from IntelliJ It is a good practice to do steps 1-4 to leave IntelliJ and its demon java processes running over night, if you have multiple repositories and a complex project, so you have everything in sync for the next day. You can in theory use all popular indexed repos out there and launch index update for all repos at the same time(I suppose IntelliJ creates a queue and runs updates one after another) then it can take hours to complete(you will need to increase heap space for that too).

注: 我花了几个小时来理解(步骤3)处理maven索引更新的IntelliJ的java恶魔进程做错了,我只需要让IntelliJ从头开始启动它。问题解决了,甚至没有重新启动IntelliJ本身。

首先,你应该尝试文件|无效缓存,如果没有帮助,删除IDEA系统目录。然后重新导入Maven项目,看看它是否有帮助。

在一些奇怪的情况下,编译类可能会报告错误的信息并混淆IDEA。使用javap验证这个jar中的类报告正确的名称。

在我看来,这种情况经常发生在依赖关系罐也是肥胖罐的时候。幸运的是,我控制了Fat Jar的构建,在把它变成一个非Fat Jar之后,事情就顺利了。没有任何其他修复任何答案或评论这里对我有效。另外可能值得注意的是,我的代码是在Kotlin中,而Fat Jar也捆绑了一些Kotlin依赖项。

另一种选择。

我在使用JDK7_07时也遇到了这个问题。我在这里尝试了所有的答案(除了删除IDEA System Directory)。但是,我还是有问题。所以我做的是:

安装最新的JDK (JDK7_45),并将Intellij的JDK设置为新的JDK,它就可以工作了。