EDIT: El enfoque javaee-endorsed-api
anterior, probablemente no tendrán ningún problema, pero me da escalofríos. No creo que ya se haya producido o mantenido.Además, el pom.xml
que contiene refleja que en algún momento se llamó javaee-compact-api
, y puede ver cómo eliminan las clases de implementación de él. Por el contrario, seleccionar cuidadosamente los frascos de API que desea utilizar según lo endosado (como recomiendo a continuación) parece ser más estable y flexible. Finalmente, si aún desea utilizar el enfoque javaee-endorsed-api
, puede seguir utilizando el enfoque general que recomiendo y apuntar a javaee-endorsed-api.jar
.
Ryan; Acabo de peinar tu largo camino en esto (tocando StackOverflow, los foros de java.net, etc.) en el mismo viaje.
Durante la prueba unitaria o de integración, tendrá que configurar la propiedad del sistema java.endorsed.dirs
, como usted sabe.
El truco es que tienes que hacer esto de forma que la JVM que ejecuta las pruebas lo levante. Y eso depende de cómo tengas funcionando Surefire.
Si por alguna razón tiene Surefire configurado en no en fork, probablemente esto sea algo malo, y debería volver a evaluar su configuración aquí.
Si tiene un juego de éxito seguro al tenedor, entonces se podría pensar que podría incluir simplemente java.endorsed.dirs
en una estrofa systemPropertyVariables
, así:
<systemPropertyVariables>
<java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>
... pero eso sería un error. La razón es que el programa que se está ejecutando es algo llamado ForkedBooter
, y el ForkedBooter
establece programáticamente las propiedades del sistema para las pruebas de su unidad. Es decir, cuando su estrofa <systemPropertyVariables>
es leída por el ForkedBooter
ya es demasiado tarde.
Pero puede utilizar <argLine>
en la configuración de éxito seguro de la siguiente manera:
<configuration>
<argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>
Ahora la VM que las horquillas de éxito seguro tendrá sus directorios aprobados valor apropiado. Ahora hablemos sobre qué valor ofrecer.
Desea seleccionar las API para sobrescribirlas. En su caso, javax.annotation.*
es una elección legítima. Desea suministrar el directorio en su repositorio Maven local que alberga el contenedor relevante.
Aquí es el valor que utilizo:
${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion}
- Maven garantiza que
${settings.localRepository}
se ampliará para el valor de donde vive su repositorio Maven locales.
${file.separator}
es una forma de obtener el valor de System.getProperty("file.separator")
en un reemplazo de propiedad Maven.
- En mi caso, ya he declarado
<dependency>
en the GlassFish artifact that bundles up the javax.annotation
package as defined in Java EE 6. Así que aquí he construido un camino hacia el artefacto. También definí una propiedad llamada javaxAnnotationVersion
, que, para mí, está configurada en 3.1.2
.
Una vez hecho todo esto, entonces cuando las horquillas de éxito seguro de una máquina virtual para ejecutar las pruebas unitarias, los directorios aprobados se establecerá en el directorio de su repositorio local de Maven que contiene el frasco que contiene las javax.annotation
clases, y ahora GlassFish incrustado — que se ejecuta en el proceso — utilizará las versiones de Java EE 6 de las clases javax.annotation
en lugar de las versiones de Java SE 6. Espero que esto te ayude.
Lo que has dicho es (IMO) la forma en que _debe_ funcionar, pero las versiones anteriores de libs endosadas en Java SE ganan el escenario de "primer partido" cuando se cargan .. Creo. Quien inicie JVM necesita configurar java.endorsed.dirs, pero es difícil con algunos de los contenedores integrados. Para Glassfish Embedded, todo está en un gran JAR y no creo que las libs endorsed estén garantizadas en un lugar específico. Comencé un [hilo Arquilliano] (http://community.jboss.org/thread/168521?tstart=0) para ver lo que piensan. Agregué un [error de Glassfish] (http://java.net/jira/browse/EMBEDDED_GLASSFISH-131). –
@Ryan J. Acabo de echar un vistazo en el informe de errores, y es efectivamente reproducible. Esto debería ser resuelto por el equipo de GlassFish siguiendo el espíritu de mi publicación anterior, pero hasta que puedan solucionarlo, hay algunas soluciones rápidas: 1. Utilice una clase principal para iniciar el servidor. 2. Cambie a otro contenedor integrado. 3. Establezca las librerías endosadas utilizando MAVEN_OPTS (uggly, pero lo pondré en funcionamiento inmediatamente ...). –