2010-06-05 15 views
13

Ich versuche javax.servlet.ServletException Instanz der Klasse zu erstellen mit Code folgendenKann nicht javax.servlet.ServletException instanziiert

public class MyTroubleViewer { 
public static void main(String[] args) { 
    javax.servlet.ServletException servletException = new javax.servlet.ServletException("Hello"); 
    System.out.println(servletException.getMessage()); 
} 
} 

Aber ich bekomme Ausnahme auf die Schaffung von:

Exception in thread "main" java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException 
... 

Maven hilft mir bei dependecies:

<dependency> 
<groupId>javax</groupId> 
<artifactId>javaee-api</artifactId> 
<version>6.0</version> 
<type>jar</type> 
<scope>compile</scope> 
</dependency> 

W Was mache ich falsch?

Antwort

20

Wie von @ user353852 erwähnt, enthält Ihre aktuelle Abhängigkeit nur die Java EE 6-APIs und enthält keine Methodenkörper. Sie können also keinen Code dagegen ausführen. Um Ihren Code außerhalb eines Behälter auszuführen, benötigen Sie eine „konkrete“ Abhängigkeit zu erhalten (von Glassfish-Repository):

<repositories> 
    <repository> 
    <id>glassfish-repository</id> 
    <url>http://download.java.net/maven/glassfish</url> 
    </repository> 
    ... 
</repositories> 

<dependencies> 
    <dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.servlet</artifactId> 
    <version>3.0</version> 
    <scope>test</scope> 
    </dependency> 
    ... 
</dependencies> 

Beachten Sie, dass solche Abhängigkeiten sollten nicht mit einem compile Umfang deklariert werden, wollen Sie nicht zu bündeln Sie es (es sollte provided oder vielleicht test sein, aber nicht compile oder runtime).


Ich frage mich, hat der Anbieter der JavaEE Umsetzung wichtig? Im Allgemeinen benutze ich Apache-Server, daher ist es großartig, dieselbe javaee-Implementierung wie auf dem Server zu haben.

In der Theorie, nein. In der Praxis würde ich jedoch empfehlen, die Implementierungs-JARs von dem Server zu verwenden, den Sie verwenden werden (oder von der Java-EE-Referenzimplementierung). Da Sie Java EE 6 verwenden, bedeutet dies in beiden Fällen JARS von GlassFish v3.

Die zweite Frage ist viel wichtiger. javax.servlet ist nur ein Teil der javaee-api Implementierung, wo finde ich die anderen. Jetzt brauche ich "javax/validation/Validation".

Für die API Bean Validation, müssen Sie die folgende (Hibernate Validator die RI ist):

<repositories> 
    <!-- For Hibernate Validator --> 
    <repository> 
    <id>jboss</id> 
    <name>JBoss repository</name> 
    <url>http://repository.jboss.org/maven2</url> 
    </repository> 
    ... 
</repositories> 

<dependencies> 
    <!-- Bean Validation API and RI --> 
    <dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.0.0.GA</version> 
    <scope>provided</scope> 
    </dependency> 
    <dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>4.0.2.GA</version> 
    <scope>runtime</scope> 
    </dependency> 
    ... 
</dependencies> 

Wie kann ich feststellen, welche Artefakt jeden Aspekt von JavaEE implementiert. Vielleicht gibt es irgendwo eine Art "Karte"?

Nichts offizielles, aber this nice answer von BalusC wird helfen.

+0

Danke, es funktioniert! – Denis

+0

Pascal, kannst du mir ein bisschen mehr helfen?Ich frage mich, ist der Anbieter der Java-Implementierung wichtig? Im Allgemeinen benutze ich Apache-Server, daher ist es großartig, dieselbe javaee-Implementierung wie auf dem Server zu haben. Aber es ist nicht so wichtig. Die zweite Frage ist viel wichtiger. javax.servlet ist nur ein Teil der javaee-api Implementierung, wo finde ich die anderen. Jetzt brauche ich "javax/validation/Validation". Wie kann ich feststellen, welches Artefakt jeden Aspekt von javaee implementiert? Vielleicht gibt es irgendwo eine Art "Karte"? – Denis

+0

Ich fand "http://maven.apache.org/guides/mini/guide-coping-with-sun-jars.html", aber es scheint, dass sie den Inhalt des Repositories geändert haben, weil ich "javax" nicht gefunden habe. j2ee: j2ee "Artefakt, das auf dieser Seite erwähnt wurde. – Denis

5

Auschecken this post. Im Grunde sind diese Maven-Bibliotheken Stubs und eignen sich nur zum Kompilieren. Diese sollen nicht zur Laufzeit referenziert werden. Zur Laufzeit (auch für Komponententests) müssen Sie auf die echte JAR-Datei verweisen, d. H. Die aus Ihrem Servlet-Container.

+0

Ich verstehe es. Vielen Dank. Aber ich habe immer noch ein Problem. Javaee wird während der Testphase benötigt, bevor es auf dem Webserver bereitgestellt wird. Bedeutet das, dass ich eine JavaEE-Implementierung im Klassenpfad meines Systems haben sollte, oder gibt es eine komfortable Möglichkeit, dies mit maven zu tun? – Denis

Verwandte Themen