2010-06-05 22 views
13

Estoy tratando de crear una instancia de la clase javax.servlet.ServletException con siguiente códigoNo se puede crear una instancia javax.servlet.ServletException

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

pero me da una excepción en la creación:

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 me ayuda con las dependencias:

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

W ¿Qué estoy haciendo mal?

Respuesta

20

Según lo mencionado por @ user353852, su dependencia actual solo contiene las API de Java EE 6 y no contiene ningún cuerpo de método. Entonces no puedes ejecutar código en contra de eso. Para ejecutar el código fuera de un contenedor, que necesita para obtener una dependencia "concreto" (desde el repositorio GlassFish):

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

Tenga en cuenta que dichas dependencias no deben ser declaradas con un alcance compile, que no quiere agruparlo (debe ser provided o quizás test, pero no compile o runtime).


Me pregunto ¿Tiene el proveedor de la aplicación JavaEE importante? En general, uso servidores Apache, por lo que sería genial tener la misma implementación javaee que en el servidor.

En teoría, no. Pero en la práctica, recomendaría utilizar los JAR de implementación del servidor que va a utilizar (o de la implementación de referencia de Java EE). Dado que está utilizando Java EE 6, esto en realidad significa JARS de GlassFish v3 en ambos casos.

La segunda pregunta es mucho más importante. javax.servlet es solo una parte de la implementación de javaee-api, donde puedo encontrar los demás. Ahora necesito "javax/validation/Validation".

Para la API Bean Validation, necesitará lo siguiente (Hibernate Validator ser el RI):

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

¿Cómo puedo determinar qué artefacto implementa cada aspecto de JavaEE. ¿Tal vez hay algún tipo de "mapa" en alguna parte?

Nada de oficial, pero this nice answer de BalusC ayudará.

+0

¡Gracias, funciona! – Denis

+0

Pascal, ¿me pueden ayudar un poco más?Me pregunto si el proveedor de la implementación de javaee es importante. En general, uso servidores Apache, por lo que sería genial tener la misma implementación javaee que en el servidor. Pero no es tan importante. La segunda pregunta es mucho más vital. javax.servlet es solo una parte de la implementación de javaee-api, donde puedo encontrar los demás. Ahora necesito "javax/validation/Validation". ¿Cómo puedo determinar qué artefacto implementa cada aspecto de javaee? ¿Tal vez hay algún tipo de "mapa" en alguna parte? – Denis

+0

Encontré "http://maven.apache.org/guides/mini/guide-coping-with-sun-jars.html" pero parece que han cambiado el contenido del repositorio, porque no pude encontrar "javax". j2ee: j2ee "artefacto que se mencionó en esta página. – Denis

5

Echa un vistazo this post. Básicamente, estas bibliotecas maven son stubs y solo sirven para compilar. Estos no están destinados a ser referenciados en tiempo de ejecución. En el tiempo de ejecución (incluso para pruebas unitarias), necesitará hacer referencia al archivo jar real, es decir, el que está fuera de su contenedor de servlet.

+0

Lo entiendo. Gracias. Pero todavía tengo un problema. Se requiere Javaee durante la etapa de prueba antes de implementarlo en el servidor web. ¿Significa que debería tener la implementación de JavaEE en el classpath de mi sistema, o hay una forma cómoda de hacerlo con maven? – Denis

Cuestiones relacionadas