【问题标题】:Intellij Idea: Issues with building project using IBM JDK 7Intellij Idea:使用 IBM JDK 7 构建项目的问题
【发布时间】:2015-12-22 14:04:13
【问题描述】:

我有一个项目需要与 IBM JDK 7 一起使用。我在 Windows 7 上使用 Intellij Idea 15.0.2。我的项目是多模块 maven 项目,使用一些 groovy 脚本,还使用 ​​gradle 来展平使用 maven org.fortasoft:gradle-maven-plugin 的 POM。现在,当我尝试构建我的应用程序 (Build -> Rebuild Project) 时,我在消息窗口中收到一条线错误

错误:java.lang.NullPointerException

当我检查 build.log (C:\Users\.IntelliJIdea15\system\log\build-log\build.log) 时,我看到以下异常。一旦我将项目 SDK 更改为 Oracle JDK 7,一切正常。知道这里出了什么问题吗?

[更新1:]我也尝试过使缓存无效并重新启动idea,只是为了排除缓存在这里玩犯规。

2015-12-22 14:16:23,343 [   4126]   INFO - .incremental.IncProjectBuilder - java.lang.NullPointerException
org.jetbrains.jps.incremental.ProjectBuildException: java.lang.NullPointerException
     at org.jetbrains.jps.incremental.groovy.GroovyBuilder.build(GroovyBuilder.java:142)
     at org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1230)
     at org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:904)
     at org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:976)
     at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:870)
     at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:695)
     at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:386)
     at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:193)
     at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:137)
     at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:294)
     at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:125)
     at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler$1.run(BuildMain.java:232)
     at org.jetbrains.jps.service.impl.SharedThreadPoolImpl$1.run(SharedThreadPoolImpl.java:42)
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:482)
     at java.util.concurrent.FutureTask.run(FutureTask.java:273)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
     at java.lang.Thread.run(Thread.java:795)
Caused by: java.lang.NullPointerException
     at java.lang.ClassLoader.loadClass(ClassLoader.java:731)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:707)
     at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.createCompilationClassLoader(InProcessGroovyc.java:179)
     at org.jetbrains.jps.incremental.groovy.InProcessGroovyc.runGroovyc(InProcessGroovyc.java:76)
     at org.jetbrains.jps.incremental.groovy.GroovyBuilder.runGroovycOrContinuation(GroovyBuilder.java:201)
     at org.jetbrains.jps.incremental.groovy.GroovyBuilder.build(GroovyBuilder.java:117)
     ... 17 more

【问题讨论】:

    标签: java intellij-idea groovy gradle


    【解决方案1】:

    你知道这里出了什么问题吗?

    如果我们查看InProcessGroovyc.createCompilationClassLoader,我们可以看到代码

     private JointCompilationClassLoader createCompilationClassLoader(Collection<String> compilationClassPath) throws Exception {
        ClassLoader parent = obtainParentLoader(compilationClassPath);
    
        ClassLoader groovyClassLoader = null;
        try {
          ClassLoader auxiliary = parent != null ? parent : buildCompilationClassLoader(compilationClassPath, null).get();
          Class<?> gcl = auxiliary.loadClass("groovy.lang.GroovyClassLoader"); // 179 line, we throw NullPointer Exception
    

    在 ClassLoader.loadClass 中

    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false); // 131 line
    }
    
    
    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
            synchronized (getClassLoadingLock(name)) {
                // First, check if the class has already been loaded
                Class<?> c = findLoadedClass(name); // return null if class not found 
    

    所以IBM JDK 7找不到groovy.lang.GroovyClassLoader的主要问​​题,请检查groovy安装是否正确,IBM JDK可以看到groovy库(groovy已下载,GROOVY_HOME环境变量设置正确并添加GROOVY_HOME/bin到您的PATH 环境变量)。

    【讨论】:

    • 不确定我是否理解您的回答。正如我在我的问题中提到的,我的项目是基于 maven 的项目,所以我将 groovy 定义为 maven 依赖项,而不是在本地引用 groovy 二进制文件GROOVY_HOME/bin。我在这里误读了你的答案吗?
    • 好像IDEA在maven下载的时候看不到groovy,你可以尝试手动下载groovy并手动设置所有设置吗?可能对你有帮助
    • 我不认为是这样,否则它也不应该与 Oracle JDK 一起使用。
    • 不,每个 JDK 都有不同的算法,他们如何找到类以及如果找不到类需要做什么。为什么不尝试手动下载 groovy 并手动设置所有设置?
    • 为了测试,我做了以下 1. 我下载了 groovy 二进制文件 2. 设置 GROOVY_HOME 3. 将 GROOVY_HOME\bin 设置为 PATH 4. 重新启动 IDEA 5. 尝试重建项目。结果还是一样。
    【解决方案2】:

    所以看起来这实际上是 v15.0.2 的一个错误。解决方法是在Settings | Build, Execution, Deployment | Compiler | User-local build process VM options下添加-Didea.parallel.class.loader=false

    更多详情here。修复应该在 v15.0.3 中可用。直到那时,这种解决方法才有效(至少对我而言)。

    【讨论】:

      猜你喜欢
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      相关资源
      最近更新 更多