【问题标题】:Failure deploying WAR on OpenShift JBoss with PostgreSQL - missing dependencies error使用 PostgreSQL 在 OpenShift JBoss 上部署 WAR 失败 - 缺少依赖项错误
【发布时间】:2014-06-17 00:59:20
【问题描述】:

我是 OpenShift 新手,并使用 JBoss AS7 和 PostgreSQL 9.2 设备创建了我的第一个应用程序。我成功创建了数据库,并尝试按照我在这两个页面上找到的说明部署现有的 WAR:

https://www.openshift.com/kb/kb-e1088-how-to-deploy-pre-compiled-java-applications-war-and-ear-files-onto-your-openshift-gear

http://openshift.github.io/documentation/oo_cartridge_guide.html#jbossas

当我执行 git push 时,我得到以下信息:

计数对象:130,完成。 Delta 压缩最多使用 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-Receive 结果:成功 远程:激活状态:成功 远程:部署完成,状态:成功 到 ssh://535e75ffe0b8cd39b600043f@jbossas-tradelite1.rhcloud.com/~/git/jbossas.g 它/ 862add8..193ff43 主 -> 主

使用 rhc tail 我看到以下内容:

==> 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 服务线程 1-2)JBAS015877:在 95 毫秒内停止部署 tradelite.war 2014/04/30 08:45:49,613 INFO [org.jboss.as.controller](DeploymentScanner-threads - 2)JBAS014774:服务状态报告 JBAS014775:新的缺失/不满足的依赖关系: 服务 jboss.naming.context.java.jboss.resources.jdbc.TradeDataSource(缺少)依赖:[服务 jboss.naming.context.java.module.tradelite.tradelite.env.jdbc.TradeDataSource] 2014/04/30 08:45:49,615 错误 [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: 复合操作失败并回滚。失败的步骤:" => {"操作步骤 2" => {"JBAS014771: 缺少/不可用依赖项的服务" => ["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]"]}}}

谁能帮助解释我为什么会得到这个以及如何解决它?

非常感谢。

这是我的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>

这是我的 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>

【问题讨论】:

    标签: postgresql jboss7.x openshift


    【解决方案1】:

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

    【讨论】:

    • 谢谢谢哈尔。我之前在standalone.xml 中看到了 3 个数据源,并完全删除了 H2 和 MySQL 的数据源。我没有persistence.xml 文件,因为我的WAR 只包含一个带有servlet 且没有EJB 的Web 应用程序。是否缺少persistence.xml 文件是(部分)问题?
    • 你是如何配置数据源的?
    • 我在上面添加了详细信息(standalone.xml 和 context.xml)。还有哪些细节会有所帮助?
    • 你试过在本地机器上运行这个应用吗?
    • 我还没有尝试在本地运行,但现在我有。我在standalone/deployments 目录中部署了WAR,得到的结果与我在OpenShift 上尝试时的结果相同...
    【解决方案2】:

    我找到的解决方案是在我的 WAR 的 WEB-INF 目录中创建一个专有的 jboss-web.xml 文件。

    在 WAR 中,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>
    

    在 WAR 中,WEB-INF/web.xml 包含:

    ...
    <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>
    ...
    

    并且在 .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>
    ...
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2010-09-13
      • 1970-01-01
      相关资源
      最近更新 更多