【问题标题】:Disable check for using 'kotlin' package in Gradle禁用在 Gradle 中使用“kotlin”包的检查
【发布时间】:2016-08-07 05:13:08
【问题描述】:

当我尝试 gradlew build 我的项目时,我收到来自 compileKotlin 任务的错误消息:

F:\IdeaProjects\walp.tinykotlintest>gradlew build
:compileKotlin
...
Only the Kotlin standard library is allowed to use the 'kotlin' package
...

BUILD FAILED 

Total time: 6.214 secs

发生这种情况是因为我在一个包中声明了一个以:kotlin...开头的类。

有没有办法通过配置我的build.gradle 脚本来禁用此检查?

编辑:我肯定知道如果我使用裸 kotlin 编译器进行编译...here is an example 使用 kotlin 编译器编译 kotlin 包中的类...所以我认为应该有一个也可以在 gradle 中做到这一点!....我希望...

到目前为止我所做的尝试:

  1. 我尝试通过配置 KotlinCompile 任务来配置gradle.build

    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    tasks.withType(KotlinCompile) {
        it.kotlinOptions.allowKotlinPackage = true
    }
    

    这些更改后 gradle 脚本运行良好...but it seems like this is getting ignored...我仍然遇到错误。

  2. 我尝试继承 KotlinCompile 类并覆盖其 beforeCompileHook() 并用我的版本替换现有的 compileKotlin 任务:

    import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    class MyKotlinCompile extends KotlinCompile {
        @Override
        public void beforeCompileHook(K2JVMCompilerArguments args) {
            args.allowKotlinPackage = true
            throw new RuntimeException("HELLO") // added to see if hook is run
        }
    }
    
    tasks.create(name: "compileKotlin", type: MyKotlinCompile, overwrite: true)
    

    Studying the source code...I was fairly certain this would work 但显然没有。我尝试使用和不使用 RuntimeException,但当我再次尝试 gradle build 时,总是出现以下错误:

    F:\IdeaProjects\walp.tinykotlintest>gradlew build --stacktrace
    :compileKotlin UP-TO-DATE                                                        
    :compileJava UP-TO-DATE     
    :processResources UP-TO-DATE      
    :classes UP-TO-DATE      
    :jar UP-TO-DATE      
    :sourcesJar UP-TO-DATE      
    :assemble UP-TO-DATE      
    :compileTestKotlin FAILED                                                  
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':compileTestKotlin'.
    > java.lang.NullPointerException (no error message)
    
    * Try:        
    Run with --info or --debug option to get more log output.
    
    * Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileTestKotlin'.
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
                            .
                            .
                            .
            at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
            at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
    Caused by: java.lang.NullPointerException
            at org.jetbrains.kotlin.gradle.tasks.KotlinCompile$populateTargetSpecificArgs$2.invoke(Tasks.kt:215)
            at org.jetbrains.kotlin.gradle.tasks.KotlinCompile.populateTargetSpecificArgs(Tasks.kt:222)
            at org.jetbrains.kotlin.gradle.tasks.KotlinCompile.populateTargetSpecificArgs(Tasks.kt:148)
            at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile.execute(Tasks.kt:105)
            at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:243)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:230)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
            ... 60 more
    

反正我可能不应该这样做……但我真的很想尝试一下。

谢谢!

【问题讨论】:

  • 包的全名是什么?
  • kotlin.jvm.internal ....haha :x

标签: gradle build.gradle kotlin


【解决方案1】:

如果 Kotlin 标准库与您正在使用的 JVM 不兼容,听起来您实际上应该做的是 fork Kotlin,进行所需的更改以与您的 JVM 兼容,然后使用标准 Maven build script 来建立你的叉子。该脚本已经提供了允许编译 kotlin 包中的文件的选项。

【讨论】:

    【解决方案2】:

    该错误与 Gradle 无关。 Kotlin 编译器不会编译 kotlin 包中的代码,除非您正在开发 Kotlin 本身。

    这样做的原因与您不能在 java 包中编写代码的原因相同。

    【讨论】:

    • 嗨,voddan,感谢您的回答..但我认为它不准确。当前可用的 kotlin 编译器提供了选项 -Xallow-kotlin-package,它禁用了 kotlin 包检查(如果您有 kotlin 编译器,请运行以下命令:kotlinc -X 以查看该选项的说明)。此外,java 编译器不会阻止我们在 java 包中声明类。我刚刚测试了用kotlin编译器编译kotlin包中的一个类,刚才用java包编译java来确定
    • 嗯,很有趣,因为我也检查了 java 并得到了java.lang.SecurityException: Prohibited package name: java.test1
    • 我知道编译器选项,但除非您是 Kotlin 开发团队的成员,否则绝对不要使用它。 kotlin 包中的类在某些情况下的编译方式与所有其他情况不同。请勿将其用于开发!
    • 你是对的。尝试在 java 包中运行 main 函数时会发生该异常。但是可以在 java 包中声明一个类,然后使用另一个包中的类...我试图在其中声明事物的原因kotlin 包是因为我正在为用于特定嵌入式系统的第三方 JVM 编程……这个 JVM 的“标准库”没有标准 JVM 中存在的所有类……这使得包括 kotlin 的运行时库得到未解析的符号...所以我想尝试看看是否可以修复它,尽管我认为我很可能会失败
    • 我认为这是一个值得与 Kotlin 团队讨论的问题。在youtrack.jetbrains.com/issues/KT 上提出问题,他们将帮助解决问题。
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多