【问题标题】:Eliminating Javac warnings for JSPs in Jasper generated Java source files?消除 Jasper 生成的 Java 源文件中 JSP 的 Javac 警告?
【发布时间】:2009-04-22 20:48:35
【问题描述】:

当使用 Jasper 编译器(使用 Tomcat)和 Java 编译器预编译 JSP 时,我看到类似这样的 javac 警告(我启用了 javac-Xlint 标志):

warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.List
_jspx_dependants.add("/some-jsp.jspf");

现在,它“只是一个警告”,但我喜欢干净的构建,所以我自然想摆脱警告。当然,我可以关闭 -Xlint 以进行 JSP 编译,但 -Xlint 是好东西,所以它会保留。

在此示例警告中,问题在于未使用通用语法。我们只有List,而不是List<String>。我意识到编写 Jasper 的好人必须迎合那些仍然被锁在 Java5 之前的世界中的不幸灵魂。没关系,但我为什么要遭受这些警告呢?

是否有一些众所周知的方法可以消除由 Jasper JSP 编译器创建的 Java 源代码引起的 javac 警告?我对特定于 IDE 的解决方案不感兴趣(尽管那将是某些使用特定 IDE 的人的部分解决方案)。我正在寻找一个普遍适用的解决方案。

对 Jasper 源代码的扫描没有发现任何会导致泛型语法发射的“Java 5+”开关。事实上,恰恰相反,我发现了这个:

apache-tomcat-6.0.18-src/java/org/apache/jasper/compiler/Generator.java:494:            out.printin("_jspx_dependants = new java.util.ArrayList(");

这清楚地表明硬编码的代码没有任何注入优雅的通用语法的希望。

【问题讨论】:

    标签: java jsp tomcat compiler-warnings


    【解决方案1】:

    禁用您知道存在但不关心的警告:

    -Xlint:-xxx
    禁用警告 xxx,其中 xxx 是警告名称之一 支持以下 -Xlint:xxx。

    here

    【讨论】:

    • 这是个好主意,但假设我的 JSP 代码有一个 scriptlet 也会生成这种类型的警告(我不是 scriptlet 的粉丝,但我们只是说有一些)。我不想掩盖这样的警告;我想知道我的代码中的警告。在某些情况下,简单地关闭所有未经检查的警告似乎可能过于粗略。
    • 当然可以,但是这个示例只允许您关闭特定的警告。您可能需要很多 -Xlint:-nnn 标志,但您会看到任何意外警告。
    • 也许我不明白,您的解决方案是否允许省略特定的警告 /instances/ 或 all 的 /particular type/ 警告?假设我的代码和生成的 Java 代码都导致了“未经检查”的警告。我想从 Jasper 代码中删除警告,但我想从我的代码中查看警告。您的解决方案能否表达:“禁用一个特定的未经检查的警告,而不是其他未经检查的警告?”我认为“-Xlint:-unchecked”会禁用所有警告。
    • 它关闭特定编译的特定警告的所有实例。因此,如果您愿意,您可以定义编译方案来编译具有特定设置的单个文件。由于编译器有一些启动时间,这会减慢它的速度,但可以为您提供非常细粒度的控制。我不知道有什么方法可以使它比每个文件更细。
    【解决方案2】:

    我正在使用基于 Ant 的构建。我目前对此问题的解决方案是使用以下 Ant 过滤代码就地编辑有问题的 Jasper 生成的 Java 代码:

    <move todir="WEB-INF/src">
        <fileset dir="WEB-INF/src"/>
        <globmapper from="*.java"
                    to="*.java.foo"/>
        <filterchain>
            <tokenfilter>
                <replacestring from="private static java.util.List _jspx_dependants;"
                               to="private static java.util.List&lt;String&gt; _jspx_dependants;"/>
                <replacestring from="_jspx_dependants = new java.util.ArrayList"
                               to="_jspx_dependants = new java.util.ArrayList&lt;String&gt;"/>
                <replaceregex pattern="public final class (.*) extends org.apache.jasper.runtime.HttpJspBase"
                              replace="@SuppressWarnings(&quot;serial&quot;)&#xA;public final class \1 extends org.apache.jasper.runtime.HttpJspBase"/>
                <replacestring from="(PageContext)_jspx_page_context"
                               to="_jspx_page_context"/>
            </tokenfilter>
        </filterchain>
    </move>
    <move todir="WEB-INF/src" overwrite="true">
        <fileset dir="WEB-INF/src"/>
        <globmapper from="*.java.foo" to="*.java"/>
    </move>
    

    请看this question了解“双招”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多