在GlassFish中,我的persistence.xml文件引用数据源jdbc / myDataSouce,但在WildFly中,数据源需要是java:/ jdbc / myDataSource.
对于使用@Resource注释的类也是如此.在GlassFish中,使用JavaMail的类的注释将是@Resource(name =“mail / myMailSession”),但要部署到WildFly,这需要是@Resource(name =“java:mail / myMailSession”).
我知道我可以解压缩EAR和JAR文件以手动编辑文件,例如persistence.xml,但我不能对已经使用@Resource注释的类执行此操作.
有没有办法可以将我的编译应用程序部署到GlassFish和WildFly上,而无需维护两个不同版本的代码?我假设答案可能取决于特定于应用程序的部署描述符,但我找不到任何涵盖这两种情况的示例.
有人能指出我正确的方向吗?
解决方法
坚持
注入:
@PersistenceContext(unitName="TestPU") private EntityManager entityManager;
或者通过ejb-jar.xml:
<persistence-context-ref> <persistence-context-ref-name>entityManager</persistence-context-ref-name> <persistence-unit-name>TestPU</persistence-unit-name> <injection-target> ... </injection-target> </persistence-context-ref>
相应的persistence.xml:
<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="TestPU" transaction-type="JTA"> <jta-data-source>datasources/TestDS</jta-data-source> <class>org.jeeventstore.persistence.jpa.EventStoreEntry</class> <properties> <property name="hibernate.show_sql" value="false"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.connection.charSet" value="UTF-8"/> <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.ddl-generation" value="drop-and-create-tables"/> </properties> </persistence-unit> </persistence>
(注意简单的jta-data-source JNDI名称)
这是一个glassfish-resources.xml文件,用于在部署时指定Derby数据库,类似的设置可用于MysqL或Postgres.
<resources> <jdbc-resource pool-name="ArquillianEmbeddedDerbyPool" jndi-name="datasources/TestDS"/> <jdbc-connection-pool name="ArquillianEmbeddedDerbyPool" res-type="javax.sql.DataSource" datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource" is-isolation-level-guaranteed="false"> <property name="databaseName" value="target/databases/derby"/> <property name="createDatabase" value="create"/> </jdbc-connection-pool> </resources>
以及JBoss standalone.xml中的设置:
<datasource jta="true" jndi-name="java:/datasources/TestDS" pool-name="TestDS" enabled="true" use-ccm="false"> <connection-url>jdbc:postgresql://localhost/test_db</connection-url> ... </datasource>
资源
我没有在Glassfish上注入JavaMail组件,但是类似于datasoruce设置,尝试从@Resource注释中剥离“java:”部分也是值得的.
@Resource(name = "mail/myMailSession")
然后配置Wildfly,以便邮件资源在“java:mail / myMailSession”JNDI位置可用.
通过ejb-jar.xml注入
另一个选择是通过ejb-jar.xml文件手动注入字段,然后使用maven等构建工具将ejb-jar-glassfish.xml或ejb-jar-wildfly.xml中的任何一个复制到所需的ejb-汇编时的jar.xml.
在我们的一个项目中,我们使用混合方法来避免xml配置的负担:我们通过ejb-jar.xml配置少量“提供者”bean,例如将持久化上下文注入到PersistenceContextProvider中,然后使用CDI通过@EJB将PersistenceContextProvider注入EJB,无需进一步配置即可找到它们,因为它们位于同一个EAR中.