antes de implementar «myapp.la guerra» en glassfish 4 tengo que

  1. crear jdbc connection pool (/WEB-INF/glassfish-resources.xml -> jdbc-connection-pool no funciona por sí mismo… multa de asadmin)
  2. crear recursos jdbc para la piscina (/WEB-INF/glassfish-resources.xml -> jdbc-resource mismo que la anterior)
  3. crear auth-reino (nada de auto, uso de asadmin por ahora)
  4. crear esquema (peristence.xml -> property javax.persistence.schema-generation.create-database-schemas, pero es falso)
  5. crear tablas (persistence.xml -> «crear tablas», que no es perfecto, pero al menos funciona)

ahora estoy haciendo:

  1. subir «myapp.la guerra», «glassfish-resources.xml» en /tmp/install
  2. asadmin add-resources ...
  3. asadmin create-auth-realm ...
  4. asadmin deploy ...
  5. asadmin disable myapp ...
  6. nano /.../glassfish/applications/myapp/WEB-INF/classes/META-INF/persistence.xml
  7. comentar un par de líneas, ctrl+o, enter, ctrl+x, enter
  8. asadmin enable myapp ...
  9. rm -Rf /tmp/install

y sin otra sugerencia estoy planeando:

  1. subir «myapp.la guerra», «deploy.sh» en /tmp/install
  2. chmod +x deploy.sh
  3. ./deploy.sh

y el script se encargará de todo.
pero me gustaría subir sólo un archivo war a través de glassfish http consola y obtener el mismo resultado.

hay una manera de tener una clase o un script llamado antes de contextInitialized?

¿cómo implementar esta cosa?


para la integridad aquí hay algo de información adicional:

/myapp/WEB-INF/classes/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="myapp" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/myapp</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/myapp"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="javax.persistence.schema-generation.create-database-schemas" value="false"/>
<property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/>
<property name="javax.persistence.schema-generation.scripts.create-target" value="C:/tmp/myapp_create.ddl"/>
<property name="javax.persistence.schema-generation.scripts.drop-target" value="C:/tmp/myapp_drop.ddl"/>
<property name="eclipselink.deploy-on-startup" value="true"/>
<property name="eclipselink.target-database" value="MySQL"/>
<!--            <property name="eclipselink.ddl-generation" value="create-tables"/> -->
<!--            <property name="eclipselink.ddl-generation.output-mode" value="database"/> -->
<!--            <property name="eclipselink.create-ddl-jdbc-file-name" value="myapp.ddl"/> -->
<!--            <property name="eclipselink.logging.level" value="FINE" /> -->
<!--            <property name="eclipselink.logging.level.sql" value="FINE"/> -->
<!--            <property name="eclipselink.logging.parameters" value="true"/> -->
<!--            <property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/> -->
</properties>
</persistence-unit>
</persistence>

/myapp/WEB-INF/glassfish-resources.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
<jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="jdbc/myapp_pool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false">
<property name="serverName" value="localhost"/>
<property name="portNumber" value="3306"/>
<property name="databaseName" value="myapp"/>
<property name="User" value="root"/>
<property name="Password" value="password"/>
<property name="URL" value="jdbc:mysql://localhost:3306/myapp"/>
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
</jdbc-connection-pool>
<jdbc-resource enabled="true" jndi-name="jdbc/myapp" object-type="user" pool-name="jdbc/myapp_pool"/>
</resources>

mientras glassfish entiende /myapp/…/persistence.xml (a veces también la ejecución de CREATE SCHEMA myapp, a veces no, aparentemente al azar, pero está bien),

definitivamente no puedo hacer glassfish leer /myapp/WEB-INF/glassfish-resources.xml. ignora este archivo.

ACTUALIZACIÓN
glassfish lee el archivo pero prefijos de nombres jndi con java:app/ romper otras referencias. siendo conscientes de esta cosa que reescribir referencias con prefijo y ahora se está trabajando muy bien.
por último, quiero señalar que si glassfish-resources.xml está dentro de META-INF (en lugar de WEB-INF) glassfish lee el archivo y también está presente en http interfaz de usuario, en «aplicaciones > myapp > descriptores»

OriginalEl autor Michele Mariotti | 2013-10-23

2 Comentarios

  1. 4

    finalmente he encontrado una solución:

    1. base de datos crear/actualizar: en ServletContextListener.contextInitialized yo uso generada en tiempo de compilación secuencia de comandos ddl para crear la base de datos si no existe, o el uso de liquibase a la actualización de la base de datos si existe. no más persistence.xml el uso de la base de datos de generación.

    2. dominio de autenticación de implementar: yo no implementar o crear cualquier contenedor específico de la esfera. en ServletContextListener.contextInitialized puedo registrar una costumbre JASPIC aplicación, que es en sí mismo un JAAS módulo de inicio de sesión de contenedor. gracias a @ArjanTijms para este artículo y esta respuesta

    OriginalEl autor Michele Mariotti

  2. 2

    Puede configurar el ámbito de la aplicación de los recursos para la jdbc-conexión-piscina y jdbc-recursos dentro de la glassfish-resources.xml y al desplegar la GUERRA de archivo que se creará. Cuando se deshaga el despliegue de la GUERRA que va a desaparecer. Que resuelve el problema de añadir manualmente con asadmin. Lo que suele hacer es configurarlo manualmente utilizando la interfaz gráfica de usuario, a continuación, copie y pegue el <jdbc-connection-pool> y <jdbc-resource> elementos de la domain.xml en glassfish-resources.xml entonces puedo cambiar el jndi-name a ser el ámbito de la aplicación, por ejemplo:

    <jdbc-resource pool-name="MyAppPool" jndi-name="java:app/jdbc/my-app-pool"></jdbc-resource>

    Luego me asegúrese de glassfish-resources.xml se empaqueta en el lugar apropiado en el archivo WAR, es decir, en el WEB-INF carpeta.

    Por lo que he leído en la documentación de Oracle para Glassfish 4 no parece que se puede empaquetar el auth-reino de configuración con la aplicación, como puede para el JDBC cosas. He presentado una solicitud de mejora para este glassfish auth-reino de embalaje de mejora sólo parece que se puede empaquetar la asociación para el reino en diversos descriptores de despliegue, consulte «Cómo establecer un ámbito para una Aplicación o Módulo de» sección de este guía para más detalles.

    HACK de Alerta

    De hecho se me acaba de ocurrir algo que es un poco de un hack pero podría solucionar este problema. Usted podría crear una sencilla APLICACIÓN web que incluye aplicaciones reales de la GUERRA de archivo (en un directorio de recursos). Este contenedor de aplicación para incluir a un cliente REST (como la Jersey cliente) que haría RESTO de llamadas a la Glassfish administración de la API de REST para ver si el auth-reino está ahí y configurado. Si es que iba a usar la API de REST para implementar el incrustados en el archivo WAR. Si no, tendría que usar la API de REST para crear el auth-reino y, a continuación, se podría implementar la GUERRA.

    No estoy muy claro sobre los problemas que están teniendo con el esquema de generación, sino que todo es apoyado a través de la persistence.xml y funciona bien. Si desea aún más funcionalidad en el camino de la migración automática de secuencias de comandos, a continuación, me gustaría ver a la integración de un paquete como FlyAway

    He aquí un ejemplo de un glassfish-resources.xml archivo de la aplicación del ámbito de los recursos, lo que funciona para mí en Glassfish 3.1.2. Algunos de los atributos que yo no y yo también no uso de JDBC JNDI nombramiento de estilo para la piscina-nombre en el jdbc de los recursos.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE resources PUBLIC
    "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN"
    "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
    <resources>
    <jdbc-connection-pool validation-table-name="TABLEVALIDATION" allow-non-component-callers="true"
    statement-cache-size="200" associate-with-thread="true" statement-timeout-in-seconds="300"
    non-transactional-connections="true" connection-leak-reclaim="true"
    lazy-connection-association="true" connection-creation-retry-attempts="12"
    lazy-connection-enlistment="true" validate-atmost-once-period-in-seconds="120"
    statement-leak-timeout-in-seconds="360"
    datasource-classname="oracle.jdbc.pool.OracleDataSource" res-type="javax.sql.DataSource"
    connection-leak-timeout-in-seconds="420" statement-leak-reclaim="true"
    name="UnitTestPool" is-connection-validation-required="true">
    <property name="DataSourceName" value="OracleDataSource"></property>
    <property name="ImplicitCachingEnabled" value="false"></property>
    <property name="NetworkProtocol" value="tcp"></property>
    <property name="DatabaseName" value="unittestdb"></property>
    <property name="LoginTimeout" value="0"></property>
    <property name="Password" value="tester"></property>
    <property name="URL" value="jdbc:oracle:thin:@testbed:1521:xe"></property>
    <property name="User" value="testertester"></property>
    <property name="PortNumber" value="1521"></property>
    <property name="ExplicitCachingEnabled" value="false"></property>
    <property name="dynamic-reconfiguration-wait-timeout-in-seconds" value="960"></property>
    <property name="MaxStatements" value="0"></property>
    </jdbc-connection-pool>
    <jdbc-resource pool-name="UnitTestPool" jndi-name="java:app/jdbc/unittestdb-pool"></jdbc-resource>
    </resources>
    mi gran problema es que glassfish ignora /WEB-INF/glassfish-resources.xml lleno en myapp.war. no hay errores o advertencias, simplemente la ignora. sin embargo ver respuesta actualizada
    y no, auth-reino no es de glassfish.org/dtds/glassfish-resources_1_5.dtd
    re: esquema de generación, su glassfish-resources.xml DTD es de GF 3.1, usas esa o Glassfish 4? JPA esquema de generación es parte de JavaEE-7 JPA 2.1 por lo que tendría que utilizar Glassfish 4 uso de ellos. Ya que no están en la JPA 2.0/EE6 spec que es en GF 3.1.x tienes que utilizar proveedor de propiedades específicas, tales como la eclipselink que han commmented.
    He actualizado mi respuesta con un ejemplo de mi glassfish-resources.xml archivo. ¿Cómo está la determinación de que lo tuyo no es ser honrado? Estás viendo excepciones? Si usted está tratando de fijándote en la GUI de administración de recursos JDBC/grupos de conexión sección usted no lo verá desde la aplicación el ámbito de los recursos no aparecer por allí.
    He editado mi respuesta una vez más con una idea para un trabajo en torno a la auth-reino problema de configuración.

    OriginalEl autor NBW

Dejar respuesta

Please enter your comment!
Please enter your name here