在带有PostgreSQL的OpenShift JBoss上部署WAR失败-缺少依赖项错误

在带有PostgreSQL的OpenShift JBoss上部署WAR失败-缺少依赖项错误,postgresql,jboss7.x,openshift,Postgresql,Jboss7.x,Openshift,我是OpenShift新手,并使用JBoss AS7和PostgreSQL 9.2 gears创建了我的第一个应用程序。我成功创建了DB,并尝试部署现有WAR,遵循我在这两页上找到的指导: 当我进行git推送时,我得到以下信息: Counting objects: 130, done. Delta compression using up to 4 threads. Compressing objects: 100% (118/118), done. Writing objects: 100

我是OpenShift新手,并使用JBoss AS7和PostgreSQL 9.2 gears创建了我的第一个应用程序。我成功创建了DB,并尝试部署现有WAR,遵循我在这两页上找到的指导:

当我进行git推送时,我得到以下信息:

Counting objects: 130, done. Delta compression using up to 4 threads. Compressing objects: 100% (118/118), done. Writing objects: 100% (125/125), 1.17 MiB | 0 bytes/s, done. Total 125 (delta 15), reused 0 (delta 0) remote: Stopping jbossas cartridge remote: Sending SIGTERM to jboss:139169 ... remote: Stopping Postgres cartridge remote: Building git ref 'master', commit 193ff43 remote: Skipping Maven build due to absence of pom.xml remote: Preparing build for deployment remote: Deployment id is 57ba6341 remote: Activating deployment remote: Starting Postgres cartridge remote: Postgres started remote: Deploying JBoss remote: Starting jbossas cartridge remote: Found 127.4.111.129:8080 listening port remote: Found 127.4.111.129:9999 listening port remote: /var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas/standalone/deploymen ts /var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas remote: /var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas remote: Failed deployments: ./tradelite.war remote: ------------------------- remote: Git Post-Receive Result: success remote: Activation status: success remote: Deployment completed with status: success To ssh://535e75ffe0b8cd39b600043f@jbossas-tradelite1.rhcloud.com/~/git/jbossas.g it/ 862add8..193ff43 master -> master ==> app-root/logs/jbossas.log ["jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSourceMissing[jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSource]"]} 2014/04/30 08:45:49,609 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment tradelite.war in 95ms 2014/04/30 08:45:49,613 INFO [org.jboss.as.controller] (DeploymentScanner-threads - 2) JBAS014774: Service status report JBAS014775: New missing/unsatisfied dependencies: service jboss.naming.context.java.jboss.resources.jdbc.TradeDataSource (missing) dependents: [service jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSource] 2014/04/30 08:45:49,615 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014771: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSourceMissing[jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSource]"]}}} 计数对象:130,完成。 增量压缩最多使用4个线程。 压缩对象:100%(118/118),完成。 写入对象:100%(125/125),1.17 MiB | 0字节/秒,完成。 总计125(增量15),重复使用0(增量0) 远程:停止jbossas盒带 远程:正在将SIGTERM发送到jboss:139169。。。 远程:停止Postgres盒带 远程:构建git ref“master”,提交193ff43 远程:由于缺少pom.xml,正在跳过Maven构建 远程:为部署准备生成 远程:部署id为57ba6341 远程:激活部署 远程:启动Postgres盒带 远程:Postgres已启动 远程:部署JBoss 远程:启动jbossas盒带 远程:找到127.4.111.129:8080侦听端口 远程:找到127.4.111.129:9999侦听端口 远程:/var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas/standalone/deploymen ts/var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas 远程:/var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas 远程:部署失败:./tradelite.war 远程:------------------------- 远程:Git Post接收结果:成功 远程:激活状态:成功 远程:部署已完成,状态为:成功 到ssh://535e75ffe0b8cd39b600043f@jbossas-tradelite1.rhcloud.com/~/git/jbossas.g 它/ 862add8..193ff43主控->主控 使用rhc tail,我可以看到以下内容:

Counting objects: 130, done. Delta compression using up to 4 threads. Compressing objects: 100% (118/118), done. Writing objects: 100% (125/125), 1.17 MiB | 0 bytes/s, done. Total 125 (delta 15), reused 0 (delta 0) remote: Stopping jbossas cartridge remote: Sending SIGTERM to jboss:139169 ... remote: Stopping Postgres cartridge remote: Building git ref 'master', commit 193ff43 remote: Skipping Maven build due to absence of pom.xml remote: Preparing build for deployment remote: Deployment id is 57ba6341 remote: Activating deployment remote: Starting Postgres cartridge remote: Postgres started remote: Deploying JBoss remote: Starting jbossas cartridge remote: Found 127.4.111.129:8080 listening port remote: Found 127.4.111.129:9999 listening port remote: /var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas/standalone/deploymen ts /var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas remote: /var/lib/openshift/535e75ffe0b8cd39b600043f/jbossas remote: Failed deployments: ./tradelite.war remote: ------------------------- remote: Git Post-Receive Result: success remote: Activation status: success remote: Deployment completed with status: success To ssh://535e75ffe0b8cd39b600043f@jbossas-tradelite1.rhcloud.com/~/git/jbossas.g it/ 862add8..193ff43 master -> master ==> app-root/logs/jbossas.log ["jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSourceMissing[jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSource]"]} 2014/04/30 08:45:49,609 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment tradelite.war in 95ms 2014/04/30 08:45:49,613 INFO [org.jboss.as.controller] (DeploymentScanner-threads - 2) JBAS014774: Service status report JBAS014775: New missing/unsatisfied dependencies: service jboss.naming.context.java.jboss.resources.jdbc.TradeDataSource (missing) dependents: [service jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSource] 2014/04/30 08:45:49,615 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014771: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSourceMissing[jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSource]"]}}} ==>app root/logs/jbossas.log[“jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSourceMissing[jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSource]”] 2014/04/30 08:45:49609信息[org.jboss.as.server.deployment](MSC服务线程1-2)JBAS015877:95毫秒内停止部署tradelite.war 2014/04/30 08:45:49613信息[org.jboss.as.controller](DeploymentScanner threads-2)JBAS014774:服务状态报告 JBAS014775:新缺少/未满足的依赖项: 服务jboss.naming.context.java.jboss.resources.jdbc.TradeDataSource(缺少)依赖项:[service jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSource] 2014/04/30 08:45:49615错误[org.jboss.as.server.deployment.scanner](DeploymentScanner线程-1){“JBAS014653:复合操作失败并被回滚。失败的步骤:“=>{”操作步骤-2“=>{”JBAS014771:缺少/不可用依赖项的服务“=>[“jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSourcejboss.naming.context.java.jboss.resources.jdbc.TradeDataSourceMissing[jboss.naming.context.context.java.jboss.resources.jdbc 有人能帮我解释一下为什么我会得到这个,以及如何修复它吗

非常感谢

以下是my standalone.xml中的数据源部分:

        <datasources>
            <datasource jndi-name="java:jboss/datasources/PostgreSQLDS" enabled="${postgresql.enabled}" use-java-context="true" pool-name="PostgreSQLDS" use-ccm="true">
                <connection-url>jdbc:postgresql://${env.OPENSHIFT_POSTGRESQL_DB_HOST}:${env.OPENSHIFT_POSTGRESQL_DB_PORT}/${env.OPENSHIFT_APP_NAME}</connection-url>
                <driver>postgresql</driver>
                <security>
                  <user-name>${env.OPENSHIFT_POSTGRESQL_DB_USERNAME}</user-name>
                  <password>${env.OPENSHIFT_POSTGRESQL_DB_PASSWORD}</password>
                </security>
                <validation>
                    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
                    <background-validation>true</background-validation>
                    <background-validation-millis>60000</background-validation-millis>
                    <!--<validate-on-match>true</validate-on-match>-->
                </validation>
                <pool>
                    <flush-strategy>IdleConnections</flush-strategy>
                </pool>
            </datasource>
            <drivers>
                <driver name="postgresql" module="org.postgresql.jdbc">
                    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                </driver>
            </drivers>
        </datasources>

jdbc:postgresql://${env.OPENSHIFT\u postgresql\u DB\u HOST}:${env.OPENSHIFT\u postgresql\u DB\u PORT}/${env.OPENSHIFT\u APP\u NAME}
postgresql
${env.OPENSHIFT\u POSTGRESQL\u DB\u USERNAME}
${env.OPENSHIFT\u POSTGRESQL\u DB\u PASSWORD}
选择1
真的
60000
空闲连接
org.postgresql.xa.PGXADataSource
这是我WAR中META-INF目录中的context.xml:

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <Resource name="jdbc/TradeDataSource" auth="Container" type="javax.sql.DataSource"
        username="xxxxx"
        password="xxxxx"
        driverClassName="org.postgresql.Driver"
        url="jdbc:postgresql://127.4.111.132:5432/jbossas"
        maxActive="20"
        maxIdle="10" />
</Context>


每个OpenShift JBoss应用程序都有三个数据源(H2、MySQL和PostgreSQL)在standalone.xml JBoss配置文件中配置。在persistence.xml中,确保您使用的是
java:JBoss/datasources/PostgreSQLDS
JNDI datasource,否则会出现异常。您可以在.openshift/config目录中找到standalone.xml。

我找到的解决方案是在我的web-INF中创建一个专有的JBoss-web.xml文件我的战争目录

在战争中,WEB-INF/jboss-WEB.xml包含:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
  <resource-ref>
    <res-ref-name>jdbc/TradeDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <jndi-name>java:jboss/datasources/PostgreSQLDS</jndi-name>
  </resource-ref>
</jboss-web>
...
<resource-ref id="ResourceRef_1">
  <res-ref-name>jdbc/TradeDataSource</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
...

jdbc/TradeDataSource
javax.sql.DataSource
java:jboss/datasources/PostgreSQLDS
在战争中,WEB-INF/WEB.xml包含:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
  <resource-ref>
    <res-ref-name>jdbc/TradeDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <jndi-name>java:jboss/datasources/PostgreSQLDS</jndi-name>
  </resource-ref>
</jboss-web>
...
<resource-ref id="ResourceRef_1">
  <res-ref-name>jdbc/TradeDataSource</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
...
。。。
jdbc/TradeDataSource
javax.sql.DataSource
容器
可分享
...
在.openshift/config目录中,standalone.xml包含

...
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
  <datasources>
    <datasource jndi-name="java:jboss/datasources/PostgreSQLDS" enabled="${postgresql.enabled}" use-java-context="true" pool-name="PostgreSQLDS" use-ccm="true">
      <connection-url>jdbc:postgresql://${env.OPENSHIFT_POSTGRESQL_DB_HOST}:${env.OPENSHIFT_POSTGRESQL_DB_PORT}/${env.OPENSHIFT_APP_NAME}</connection-url>
      <driver>postgresql</driver>
      <security>
        <user-name>${env.OPENSHIFT_POSTGRESQL_DB_USERNAME}</user-name>
        <password>${env.OPENSHIFT_POSTGRESQL_DB_PASSWORD}</password>
      </security>
      <validation>
        <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
        <background-validation>true</background-validation>
        <background-validation-millis>60000</background-validation-millis>
        <!--<validate-on-match>true</validate-on-match>-->
      </validation>
      <pool>
    <flush-strategy>IdleConnections</flush-strategy>
      </pool>
    </datasource>
    <drivers>
      <driver name="postgresql" module="org.postgresql.jdbc">
        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
      </driver>
    </drivers>
  </datasources>
</subsystem>
...
。。。
jdbc:postgresql://${env.OPENSHIFT\u postgresql\u DB\u HOST}:${env.OPENSHIFT\u postgresql\u DB\u PORT}/${env.OPENSHIFT\u APP\u NAME}
postgresql
${env.OPENSHIFT\u POSTGRESQL\u DB\u USERNAME}
${env.OPENSHIFT\u POSTGRESQL\u DB\u PASSWORD}
选择1
真的
60000
空闲连接
org.postgresql.xa.PGXADataSource
...

使用这些文件(以及standalone.xml和jboss web.xml中匹配的JNDI名称),WAR成功部署。

谢谢Shekhar。我之前在standalone.xml中看到了3个数据源,并完全删除了H2和MySQL的数据源。我没有persistence.xml文件,因为我的WAR只包含一个带有servlet的web应用程序,没有EJB。缺少persistence.xml文件可能是我的一部分吗问题?您如何配置数据源?我在上面添加了详细信息(standalone.xml和context.xml)。还有什么其他详细信息会有帮助?您是否尝试在本地计算机上运行此应用程序?我还没有尝试在本地运行,但现在我已经尝试了。我在standalone/d部署中部署了WAR