2009-04-22 3 views
2

Wenn Pre-Kompilierung JSPs mit dem Jasper-Compiler (Tomcat) und dann der Java-Compiler Ich sehe javac Warnungen wie diese (ich habe javac ‚s -Xlint Flag aktiviert):Beseitigung von JavaC-Warnungen für JSPs in Jasper generierte Java-Quelldateien?

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

Nun, es ist„nur eine Warnung, "aber ich mag saubere Builds, also möchte ich natürlich die Warnung loswerden. Sicher, ich könnte -Xlint für die JSP-Kompilierung ausschalten, aber -Xlint ist gute Sachen, also bleibt es.

In diesem Beispiel Warnung ist das Problem, dass generische Syntax nicht verwendet wird. Anstelle von List<String> haben wir nur List. Ich stelle fest, dass die guten Leute, die Jasper schreiben, sich um diese unglücklichen Seelen kümmern müssen, die in einer pre-Java5-Welt eingesperrt bleiben. Das ist in Ordnung, aber warum sollte ich diese Warnungen ertragen müssen?

Gibt es eine bekannte Methode zur Beseitigung von Javac-Warnungen, die durch den vom Jasper JSP-Compiler erzeugten Java-Quellcode verursacht werden? Ich bin nicht an einer IDE-spezifischen Lösung interessiert (obwohl das eine Teillösung für einige Leute wäre, die die bestimmte IDE benutzen). Ich suche nach einer allgemein gültigen Lösung.

Ein Scan des Jasper-Quellcodes ergab keine "Java 5+" -Schalter, die generische Syntax-Emissionen verursachen würden. In der Tat, im Gegenteil fand ich diese:

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

, die eindeutig den fest codierten Code bar jede Hoffnung zeigt für die Injektion von elegant allgemeiner Syntax.

Antwort

1

Deaktivieren Sie die Warnungen Sie wissen, gibt es und kümmern sich nicht um mit:

-Xlint: -xxx
deaktivieren Warnung xxx, wobei xxx eine der Warn Namen ist für -Xlint unterstützt: xxx, unten.

Siehe here.

+0

Dies ist eine gute Idee, aber angenommen, dass mein JSP-Code ein Skriptlet hat, das auch diese Art von Warnung generiert (ich bin kein Fan von Scriptlet, aber lassen Sie uns einfach sagen, dass es einige gibt). Ich möchte solche Warnungen nicht verschleiern. Ich würde gerne über Warnungen in meinem Code wissen. Wenn man beispielsweise alle nicht aktivierten Warnungen abstellt, scheint es in manchen Fällen zu grob zu sein. –

+0

Sicher, aber dieses Beispiel lässt Sie nur bestimmte Warnungen deaktivieren. Möglicherweise benötigen Sie viele -Xlint: -nnn-Flags, aber Sie sehen alle unerwarteten Warnungen. –

+0

Vielleicht verstehe ich nicht, erlaubt Ihre Lösung bestimmte Warnung/Instanzen/werden gelöscht, oder * alle * Warnungen eines/bestimmten Typs /? Angenommen, sowohl mein Code als auch der generierte Java-Code verursachen eine "ungeprüfte" Warnung. Ich möchte die Warnung aus dem Jasper-Code herausnehmen, aber ich möchte die Warnung von meinem Code sehen. Kann Ihre Lösung Folgendes zum Ausdruck bringen: "Deaktivieren Sie diese eine bestimmte nicht markierte Warnung, aber keine anderen nicht aktivierten Warnungen?" Ich denke, dass "-Xlint: -unchecked" alle Warnungen deaktiviert. –

0

Ich verwende einen Ant-basierten Build. Meine aktuelle Lösung für dieses Problem ist der säumigen Jasper erzeugten Java-Code an Ort und Stelle mit dem folgenden Ant Filterung Code zu bearbeiten: „Doppel move“

<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> 

Bitte sehen this question das verstehen