IntelliJ IDEA 刷新 Gradle 项目时耗时较长

12

我有一个非常大的项目,其中有许多在Gradle中配置的子项目。当我从命令行进行干净的构建时,需要大约10分钟的时间,但之后整个项目的构建非常快。

我的问题是将项目导入IntelliJ Community Edition。第一次导入需要大约10分钟,但之后每当我刷新项目时,仍需要相同的时间。 我看到正在执行后台任务:我看到消息被非常快速地显示,然后它停留在 Gradle:Build 处,我不知道它在做什么!

我尝试增加日志级别,并看到一个 DEBUG 消息,其中写着: .project.GradleProjectResolver-Gradle data obtained in 311943 ms ,我认为这就是需要很长时间的原因,但正如我所说,我不知道它在做什么需要这么长时间

顺便说一下,我正在使用gradle包装器(不确定是否有所不同)

任何帮助都将不胜感激, 提前致谢


可能是与此问题相同:https://intellij-support.jetbrains.com/hc/en-us/community/posts/206812445-Troubleshooting-extremely-long-refreshes-of-Gradle-projects - Stijn Van Bael
2个回答

12

我在使用Gradle 3.4.1和IDEA 2016.3.5时遇到了类似的问题。一个大型项目的刷新需要约30分钟。我使用YourKit分析器连接了Gradle守护进程以调查它在做什么。我注意到它花了很多时间在 java.net.Inet6AddressImpl.lookupAllHostAddr上。当我谷歌这个问题时,我很快发现了这个解决方案: http://justthesam.com/2016/10/fixing-java-net-inet6addressimpl-lookupallhostaddr-slowdown/

这似乎是Mac OSX上Java进程在不支持IPv6的网络上存在的问题,导致IPv6查找超时。要应用此修复程序,请在终端窗口中输入hostname以查找您的主机名。然后将主机名添加到/etc/hosts中。

127.0.0.1   localhost Your-Hostname-Here
::1         localhost Your-Hostname-Here

为确保不破坏其他内容,请将localhost保留在其中。感谢Sam发现此修复方法。

请注意,您可能会因许多不同的原因经历长时间的刷新。但是,在Gradle守护程序上连接分析器应该可以更深入地了解正在发生的情况。


我在Intellj Idea 17.3尝试了这个,但是不起作用。但根据VisualVM显示,在Gradle Daemon中有一个RMI TCP连接线程正在等待某些东西。 - WebComer

2

针对未来读者:

在这个过程中,我学到了一些东西。

第一点。你的潜在仓库列表中顺序很重要。如果你把 "https://repo1.mycompany.com:443/artifactory/Our-Releases/" 放在第一位,它将首先尝试连接那里,很可能失败,然后才会去 jcenter。这是我的主要问题。

如果你有一个多模块项目……尽量集中在(根)build.gradle 中。 也就是说,删除任何(非根)build.gradle 文件中的 "repository" 声明。

通常情况下,不要包含 "mavenLocal"。请参见下面的链接。

通常情况下,选择 jcenter 或 mavenCentral,但由于 jcenter 是 mavenCentral 的超集,你不需要两个都选。请参见下面的 SOF 答案链接。

repositories {

    // ORDER MATTERS HERE.  See : https://dev59.com/7lUL5IYBdhLWcg3wK1cU#50726436
    
    //  As a general advice, you should avoid adding mavenLocal() as a repository.   https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:case-for-maven-local 
    //mavenLocal()
    jcenter()
    //jcenter is a superset of mavenCentral() so we do not specify mavenCentral here
    maven { url "https://repo1.mycompany.com:443/artifactory/Our-Releases/" }
    maven { url "https://repo1.mycompany.com:443/artifactory/Our-Snapshots/" }


}

对于我的多模块Gradle设置,我将上述内容嵌套在内部。

subprojects { 
}

如果您有一个单体应用,那么您就不能在子项目下嵌套使用。如果我将上述内容放在“子项目”中,我必须将其中一些内容放在(根)build.gradle文件中。
// repositories that apply to ONLY the root project.
repositories {
    jcenter()

}

如果你希望根目录和模块仓库相同,你可以将所有内容放在 "allprojects" 中。

尽可能地进行整合。

2022年2月/3月更新

jcenter()现已过时。

请使用

mavenCentral()

代替jcenter()

参见:JCenter的弃用对Gradle和Android的影响


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