0

我继承了一个项目,并试图让它通过 jetty:run 运行但无济于事。使用 run-war 或 run-exploded 可以正常工作,但似乎无法确定普通旧运行的问题。它给了我以下堆栈:

2012-06-28 15:02:32.247:INFO:/:Initializing Spring root WebApplicationContext
WARN [main] JDBCExceptionReporter.logExceptions(233) | SQL Error: 0, SQLState: null
ERROR [main] JDBCExceptionReporter.logExceptions(234) | Cannot create PoolableConnectionFactory (Access denied for user 'root'@'localhost' (using password: NO))
WARN [main] SettingsFactory.buildSettings(147) | Could not obtain connection to query metadata
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access denied for user 'root'@'localhost' (using password: NO))
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:855)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:114)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2833)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2829)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1840)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:814)

/src/main/resources/applicationContext-resources.xml

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:jdbc.properties</value>
            <value>classpath:mail.properties</value>
        </list>
    </property>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
    <property name="driverClass"  value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="initialPoolSize" value="8"/>
    <property name="minPoolSize" value="8"/>
    <property name="maxPoolSize" value="32"/>
    <property name="idleConnectionTestPeriod" value="600"/>
    <property name="maxIdleTime" value="0"/>
    <property name="maxStatements" value="0"/>
    <property name="maxStatementsPerConnection" value="0"/>
    <property name="acquireIncrement" value="3"/>
    <property name="acquireRetryAttempts" value="3"/>
    <property name="acquireRetryDelay" value="1000"/>
    <property name="autoCommitOnClose" value="false"/>
    <property name="maxConnectionAge" value="14400"/>
    <property name="forceIgnoreUnresolvedTransactions" value="false"/>
    <property name="numHelperThreads" value="20"/>
    <property name="testConnectionOnCheckin" value="false"/>
    <property name="testConnectionOnCheckout" value="false"/>
    <property name="preferredTestQuery" value="select id from xtcirc101themes where rownum = 1"/>
    <property name="maxAdministrativeTaskTime" value="0"/>
    <property name="debugUnreturnedConnectionStackTraces" value="false"/>
    <property name="maxIdleTimeExcessConnections" value="0"/>
    <property name="breakAfterAcquireFailure" value="false"/>
    <property name="checkoutTimeout" value="0"/>
    <property name="unreturnedConnectionTimeout" value="0"/>
    <property name="usesTraditionalReflectiveProxies" value="false"/>
</bean>

/src/main/resources/applicationContext.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>
            .
            .
            .
        </list>
    </property>
</bean>

/WEB-INF/web.xml 中的上下文配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:/applicationContext-resources.xml
        classpath:/applicationContext-dao.xml
        classpath:/applicationContext-service.xml
        classpath*:/applicationContext.xml
        /WEB-INF/applicationContext*.xml
        /WEB-INF/classes/applicationContext*.xml
        /WEB-INF/classes/tbmJobs*.xml
        /WEB-INF/xfire-servlet.xml
        /WEB-INF/security.xml
    </param-value>
</context-param>

/src/main/resources/jdbc.properties

jdbc.driverClassName=${jdbc.driverClassName}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}

hibernate.dialect=${hibernate.dialect}

# Needed by Hibernate3 Maven Plugin defined in pom.xml
hibernate.connection.username=${jdbc.username}
hibernate.connection.password=${jdbc.password}
hibernate.connection.url=${jdbc.url}
hibernate.connection.driver_class=${jdbc.driverClassName}

在 pom.xml 中配置的属性

<properties>
    <dbunit.dataTypeFactoryName>org.dbunit.ext.oracle.OracleDataTypeFactory</dbunit.dataTypeFactoryName>
    <dbunit.schema>SYSTEM</dbunit.schema>
    <hibernate.dialect>org.hibernate.dialect.Oracle10gDialect</hibernate.dialect>

    <jdbc.groupId>com.oracle</jdbc.groupId>
    <jdbc.artifactId>ojdbc14</jdbc.artifactId>
    <jdbc.version>10.2.0.3.0</jdbc.version>
    <jdbc.driverClassName>oracle.jdbc.OracleDriver</jdbc.driverClassName>
    <jdbc.url>jdbc:oracle:thin:@${oracle.host}:1521:${oracle.sid}</jdbc.url>
    <jdbc.username>*******</jdbc.username>
    <jdbc.password>*******</jdbc.password>
</properties>
4

1 回答 1

0

因此,经过大量研究和反复试验,罪魁祸首似乎是 jetty-maven-plugin。该项目使用的是 6.1.9 版本,当我意识到它在执行 jetty:run 时不允许战争覆盖时,我立即将其更改为 6.1.26。这导致了上述错误。

通过反复试验,我能够确定 dataSource bean 和 applicationContext-resources.xml 文件存在问题。由于未定义数据源,在尝试创建 sessionFactory 时,注释掉 xml 文件中的 bean 定义应该会导致 BeanCreationException。然而,这被证明是不真实的并导致相同的错误,这意味着它指的是不同的数据源,可能在 Spring 中配置为默认值?目前不确定。将 dataSource 重命名为 dataSource2 解决了这个问题,但我不喜欢这个解决方案。

阅读有关 jetty 插件的更多信息后,我决定迁移到最新版本的 jetty 7。我最初决定继续使用 6,因为我不想一次进行太多更改,但迁移到 7 被证明是一个明智的决定。数据源文件的问题立即消失了。这导致了下一组问题,即struts。似乎我们在 struts.xml 中覆盖并重用了 default 和 admin 的包名称。这同样适用于 run-war 或 run-exploded,但运行时会导致 struts 错误。我们目前使用的是 appfuse 版本 2.0.2,但我也在考虑更新它。

一旦我能够解决 struts 问题,我就会遇到 web.xml 的问题。我们一直在使用资源过滤来动态设置 web.xml 和几个 jsp 中的一些值。这是 jetty:run 的问题,因为它假定 webapp 文件是静态的并且不应用资源过滤。使用标签我能够告诉码头和战争插件使用 web.xml 的资源过滤版本。不过,jsp 是另一个问题。

有点谷歌搜索,我发现。使用属性文件,我能够对 is 应用资源过滤,然后使用 spring,在访问 jsp 时从属性文件中读取值。最后,我可以让 jetty:run 启动我的应用程序。但是,现在似乎在尝试热交换代码时出现 PermGen 空间错误。看起来它经历了多次重启并最终导致 PermGen 错误。我目前将 PermGen 大小设置为 -XX:PermSize=64M -XX:MaxPermSize=128M。猜猜它更多的试错时间。

于 2012-07-02T12:56:31.530 回答