Я схожу с ума, пытаясь сделать веб-приложение Java EE 6 переносимым между Glassfish AS 3.x и JBoss AS 6 (и 7, когда оно будет выпущено).
Поскольку каждый сервер сопоставляет имена JNDI для источников данных по-разному, мне нужно указать частное внутреннее имя приложения для источника данных в persistence.xml, а затем использовать glassfish-web.xml или jboss-web.xml (в зависимости от ситуации), чтобы сопоставить это с реальное имя источника данных на сервере.
Теория проста (ну, для EE):
К сожалению, теория далеко не исчерпывающая, потому что, хоть убей, я nне заставить его работать в Glassfish AS 3.1, 3.1.1, 3.2 beta, JBoss AS 6 или JBoss AS 7 beta. Прямо сейчас я сосредоточен на том, чтобы заставить его работать на Glassfish.
Glassfish сообщает «Недопустимый ресурс: my-datasource__pm», когда я пытаюсь развернуть приложение, которое ссылается на «my-datasource» в 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="org.example_glassfish-webxml-datasource-jndi-mapping_war_1.0-SNAPSHOTPU" transaction-type="JTA">
<jta-data-source>my-datasource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>
</persistence-unit>
</persistence>
и отображает его в известный существующий источник данных через web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!-- servlet declarations etc elided ... -->
<resource-ref>
<res-ref-name>my-datasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
... и glassfish-web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
<resource-ref>
<res-ref-name>my-datasource</res-ref-name>
<jndi-name>realdsname</jndi-name>
</resource-ref>
</glassfish-web-app>
«asadmin list-jndi-entries» показывает фактическое имя JNDI источника данных точно так, как оно отображается в glassfish-web. xml, а также перечисление другой записи с суффиксом «__pm», созданной Glassfish:
$ asadmin list-jndi-entries
.... unrelated output ....
realdsname__pm: javax.naming.Reference
realdsname: javax.naming.Reference
Излишне говорить, что это полностью меня заводит. Есть идеи, что мне не хватает?