【问题标题】:How to add -Xlint:unchecked to my Android Gradle based project?如何将 -Xlint:unchecked 添加到我的基于 Android Gradle 的项目中?
【发布时间】:2013-09-12 10:02:49
【问题描述】:

我尝试将以下内容添加到根 build.gradle 文件中:

subprojects {
    gradle.projectsEvaluated {
        tasks.withType(Compile) {
            options.compilerArgs << "-Xlint:unchecked -Xlint:deprecation"
        }
    }
}

但我明白了:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':Libraries:ActionBarSherlock:compileRelease'.
> invalid flag: -Xlint:unchecked -Xlint:deprecation

我做错了什么?

【问题讨论】:

  • 只有一个参数是否一切正常,例如 options.compilerArgs
  • 是的,它有效。我已更改为"-Xlint:unchecked" &lt;&lt; "-Xlint:deprecation",它对两者都有效:) 如果您想用这个创建答案,我很乐意将其标记为已接受。
  • @RicardoAmaral 也许您应该自己正式回答并参考此 shakalaca 的评论。

标签: android gradle javac lint


【解决方案1】:

对于弃用,您现在可以在 gradle kotlin 脚本中使用它,这比修改 compilerArgs 更好,因为它是类型安全的:

tasks.withType<JavaCompile> {
    options.isDeprecation = true
}

在更高版本的 Gradle 中,我建议使用新的 API:

tasks.withType<JavaCompile>().configureEach {
    options.isDeprecation = true
}

【讨论】:

    【解决方案2】:

    对于使用gradle.kts 的每个人,请使用以下内容来匹配简单的build.gradle 文件

    build.gradle.kts

    afterEvaluate {
            tasks.withType(JavaCompile::class) {
                options.compilerArgs.add("-Xlint:unchecked")
                options.compilerArgs.add("-Xlint:deprecation")
            }
        }
    

    build.gradle

     gradle.projectsEvaluated {
            tasks.withType(JavaCompile) {
                options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
            }
        }
    

    【讨论】:

    • 您也可以将其写为tasks.withType&lt;JavaCompile&gt;,减少 7 个字符。
    【解决方案3】:

    免责声明:尽管这个答案有超过 10 个赞成票,但它并没有解决 Android 项目上下文中的问题。但是,Google 在非 Android 项目的上下文中发现了这个问题。因此,我为这些人保留了这个答案。

    根据JavaCompile,以下似乎是解决方案:

    compileJava {
        options.encoding = 'UTF-8'
        options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
    }
    

    如果您希望它用于测试用例,请使用compileTestJava

    compileTestJava {
        options.encoding = 'UTF-8'
        options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
    }
    

    【讨论】:

    • 这是在顶层 build.gradle 中还是在模块中?
    • 在模块的build.gradle文件中。
    • 你能扩展第一个sn-p的上下文吗? gradle.build 去哪儿了?
    • 此解决方案适用于在其build.gradle 文件中应用java 插件的模块,但不适用于应用com.android.applicationcom.android.library 插件的模块。
    • @koppor:见之前的评论。不适用于安卓开发者。对于题为“...基于 Android gradle 的项目”的线程来说,这是一个问题。
    【解决方案4】:

    把它放在你的 build.gradle 文件(根目录)中:

    allprojects { // Projects
       gradle.projectsEvaluated {
          tasks.withType(JavaCompile) {
             options.encoding = 'UTF-8'
             options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
          }
       }
    }
    

    【讨论】:

      【解决方案5】:

      我不确定问题在于使用 Gradle subprojects 配置参数,但您使用的语法:

      options.compilerArgs << "-Xlint:unchecked -Xlint:deprecation"
      

      这对我有用:

      subprojects {
        gradle.projectsEvaluated {
          tasks.withType(JavaCompile) {
            options.compilerArgs += [
              '-Xlint:unchecked', // Shows information about unchecked or unsafe operations.
              '-Xlint:deprecation', // Shows information about deprecated members.
            ]
          }
        }
      }
      

      subprojects {
        gradle.projectsEvaluated {
          tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
          }
        }
      }
      

      如果您只想添加一个选项(通常会添加更多),则在任务JavaCompile 中您只需添加:

      options.compilerArgs << "-Xlint:unchecked"
      

      您可以找到有关 Lint herehere 的更多信息。

      【讨论】:

        【解决方案6】:

        这对我有用: (在您项目的 build.gradle 中)

        allprojects {
            gradle.projectsEvaluated {
                tasks.withType(JavaCompile) {
                    options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
                }
            }
        }
        

        【讨论】:

        • 你将如何只对主模块执行此操作,不包括依赖项?
        • @aleb,我假设您的意思是仅将设置应用于当前 build.gradle 而不是所有 build.gradle(即所有项目)。在这种情况下,不要将其包装在 allprojects 闭包中。
        • 这会对 Lint 运行产生影响吗?出于某种原因,无论-Xlint:unchecked 设置如何,我的 Lint 都会显示完全相同的警告消息。
        • 我认为将其添加到“build-extras.gradle”而不是“build.gradle”会更好。
        • 谢谢,这对我有用,虽然我不确定这个答案来自哪里。对我来说这似乎很荒谬,默认情况下,在您添加这些选项之前,linter 会引发一个没有有关问题的信息的错误。
        【解决方案7】:

        我有一个不同的编译参数要设置。以下对我有用。

        gradle.projectsEvaluated {
            tasks.withType(JavaCompile) {
                options.compilerArgs << "-XDignore.symbol.file"
                options.bootClasspath = "$System.env.JAVA_HOME/jre/lib/rt.jar"
            }
        }
        

        您必须为诸如 Unsafe 和 sun.swing.* 类之类的 JDK 1.8 及更高版本设置引导类路径。修复源代码,特别是后者,因为 Jigsaw Java 9,即将到来的 JRE 模块化实现,最终将使这些方法无法访问(!)。认为自己受到警告。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 2017-01-22
          • 1970-01-01
          • 2022-10-15
          • 2012-07-22
          • 2013-09-29
          相关资源
          最近更新 更多