当我尝试在 TomCat 这个使用 Spring 的应用程序上部署和执行时,为什么会出现此异常?

Why I obtain this exception when I try to deploy and execute on TomCat this application that use Spring?

我不太喜欢 MavenNetBeans(我过去使用过 Eclipse 和 Ant),我遇到了以下问题在 TomCat 上部署和执行一个使用 Spring.

的 Web 应用程序

我已经使用 Maven 功能获得了一个名为 Project from Archetype 的项目,并选择了教程中指定的原型(名为entando-archetype-portal-bootstrap,这是生成 Entando 门户的原型。

在下一个 NetBeans window 中,我将 项目名称 指定为 myfirstportalGroup 我指定的id com.entando

我没有更改默认项目路径,即:

/home/andrea/NetBeansProjects/myfirstportal

然后,在 NetBeans 项目选项卡中,我 select 我的项目和我执行 Maven 清理和构建 任务,该任务工作了几秒钟并且正确地以构建成功 消息。

看来构建过程没问题。

然后我 select 我的项目和我执行 运行,所以我选择我的 TomCat 安装。

启动过程开始但最后我总是收到此错误消息:

ebapp assembled in [9582 msecs]
Building war: /home/andrea/NetBeansProjects/myfirstportal/target/myfirstportal.war

--- tomcat7-maven-plugin:2.1:exec-war-only (war-build-standalone) @ myfirstportal ---
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 31.067s
Finished at: Thu Jul 02 18:23:41 CEST 2015
Final Memory: 48M/233M
------------------------------------------------------------------------
NetBeans: Deploying on Apache Tomcat or TomEE
    profile mode: false
    debug mode: false
    force redeploy: true
Checking data source definitions for missing JDBC drivers...
Undeploying ...
undeploy?path=/myfirstportal
OK - Undeployed application at context path /myfirstportal
In-place deployment at /home/andrea/NetBeansProjects/myfirstportal/target/myfirstportal
Deployment is in progress...
deploy?config=file%3A%2Ftmp%2Fcontext5305066681099450691.xml&path=/myfirstportal
FAIL - Deployed application at context path /myfirstportal but context failed to start

正如您在最后看到的那样,该过程失败并显示此特定错误消息:

FAIL - Deployed application at context path /myfirstportal but context failed to start

所以我调查了进一步打开 NetBeans 服务 window 右键单击​​ Tomcat 服务器和 select 查看服务器日志,在这里我得到了应该导致失败的异常:

03-Jul-2015 13:33:40.806 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log No Spring WebApplicationInitializer types detected on classpath
03-Jul-2015 13:33:41.546 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
03-Jul-2015 13:33:52.989 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class org.entando.entando.aps.servlet.StartupListener
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'InitializerManager' defined in class path resource [spring/baseSystemConfig.xml]: Invocation of init method failed; nested exception is java.lang.Exception: Error while initializating Db Installer
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:302)
................................................................
................................................................
................................................................
Caused by: java.lang.Exception: Error while initializating Db Installer
    at org.entando.entando.aps.system.init.InitializerManager.init(InitializerManager.java:49)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
................................................................
................................................................
................................................................
Caused by: java.lang.RuntimeException: Error while loading component installation report - version: production
    at org.entando.entando.aps.system.init.InstallationReportDAO.loadReport(InstallationReportDAO.java:58)
    at org.entando.entando.aps.system.init.AbstractInitializerManager.extractReport(AbstractInitializerManager.java:40)
    ... 66 more
Caused by: com.agiletec.aps.system.exception.ApsSystemException: Error getting connection to the datasource
    at com.agiletec.aps.system.common.AbstractDAO.getConnection(AbstractDAO.java:64)
    at org.entando.entando.aps.system.init.InstallationReportDAO.loadReport(InstallationReportDAO.java:40)
    ... 67 more
Caused by: java.sql.SQLException: Cannot load JDBC driver class 'org.apache.derby.jdbc.EmbeddedDriver'
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2043)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1939)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1412)
    at com.agiletec.aps.system.common.AbstractDAO.getConnection(AbstractDAO.java:61)
    ... 68 more
Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2034)
    ... 71 more

03-Jul-2015 13:35:54.960 INFO [http-nio-8080-exec-14] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext

似乎它可能取决于某些数据库连接问题

可能是什么问题?我错过了什么?我该如何尝试修复它?

Tnx

编辑 1:

所以在我看来,我的 NetBeans 项目(包含从 Maven 下载的所有 jar)的 Dependencies 文件夹中没有 derby-10.x.x.x.jar 文件,但进入 pom.xml 文件,我参考了 detby 驱动程序 class:

<properties>
    <!--
    <test.database.driver>org.postgresql.Driver</test.database.driver>
    <test.database.hostname>localhost</test.database.hostname>
    <test.database.port>5432</test.database.port>
    <test.database.username>agile</test.database.username>
    <test.database.password>agile</test.database.password>
    <test.database.port.url>jdbc:postgresql://${test.database.hostname}:${test.database.port}/${project.artifactId}testPort</test.database.port.url>
    <test.database.serv.url>jdbc:postgresql://${test.database.hostname}:${test.database.port}/${project.artifactId}testServ</test.database.serv.url>
    -->
    <!--
    <test.database.driver>com.mysql.jdbc.Driver</test.database.driver>
    <test.database.hostname>localhost</test.database.hostname>
    <test.database.port>3306</test.database.port>
    <test.database.username>root</test.database.username>
    <test.database.password>agile</test.database.password>
    <test.database.port.url>jdbc:mysql://${test.database.hostname}:${test.database.port}/${project.artifactId}testPort</test.database.port.url>
    <test.database.serv.url>jdbc:mysql://${test.database.hostname}:${test.database.port}/${project.artifactId}testServ</test.database.serv.url>
    -->
    <test.database.driver>org.apache.derby.jdbc.EmbeddedDriver</test.database.driver>
    <test.database.hostname>localhost</test.database.hostname>
    <test.database.port>1527</test.database.port>
    <test.database.username>agile</test.database.username>
    <test.database.password>agile</test.database.password>
    <test.database.port.url>jdbc:derby:${project.build.directory}/test/db/${project.artifactId}testPort;create=true</test.database.port.url>
    <test.database.serv.url>jdbc:derby:${project.build.directory}/test/db/${project.artifactId}testServ;create=true</test.database.serv.url>

    <skipDerby>true</skipDerby>
    <skipStandalone>true</skipStandalone>
    <entando.version>4.2.0-TP1</entando.version>
    <spring.version>4.0.6.RELEASE</spring.version>
    <struts2.version>2.3.16.3</struts2.version>
    <cxf.version>3.0.0-milestone2</cxf.version>
</properties>

如您所见,与 postgresqlMySql DBMS 相关的部分已禁用,而是与org.apache.derby.jdbc.EmbeddedDriver 似乎已启用。

进入 dependencies 部分我发现:

<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.9.1.0</version>
</dependency>

<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derbyclient</artifactId>
    <version>10.9.1.0</version>
</dependency>

所以我认为 Maven 应该正确下载和配置 derby 驱动程序 classes.

为什么好像没有下载这个jar?

说找不到驱动程序。如果是 tomcat - 将驱动程序 jar 放入 libs 文件夹并尝试重新启动它。

编辑:您提供依赖项的方式仅在编译时可用,但在结果 war 中不可用。我认为你应该使用 assembly-pluginshade-plugin 之类的东西来在 war.

中提供这个 jar

但是如果您查看 tomcat 文档... ta-daaa -(搜索词 forget)- 您应该向 lib文件夹。

您需要 derby-10.x.x.x.jarderby download 到您的 class path/lib。

将 Maven 依赖项添加到 java 构建路径将解决您的错误。

在 java 构建路径菜单中添加库和 select maven 依赖项。