未找到Spring Boot JNDI - 无法使用Maven

时间:2017-06-22 14:09:34

标签: java spring jdbc spring-boot jndi

我无法清理安装我的项目。 我需要在WAR(而不是jar)中使用远程JNDI,但是在application.properties中使用名称会在mvn clean install期间抛出错误(由于"未找到数据源jndi名称")

如果我必须使用来自远程服务器的jndi名称,我无法控制,如何在没有查找失败的情况下在WAR中编译我的包,但是在服务器上部署/安装应用程序时让它查找?任何提示,或方向都非常有用......

在app prop中,我有

spring.datasource.jndi名= JDBC / FF-应用

我尝试过:Spring boot JNDI datasource lookup failure - Name comp/env/jdbc not found in context "java:"

尝试了,http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-a-jndi-datasource

几乎在stackoverflow中提出的关于远程jndi的所有问题..

一些错误:

  

引起:org.springframework.beans.BeanInstantiationException:无法实例化[javax.sql.DataSource]:工厂方法' dataSource'抛出异常;嵌套异常是org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException:无法查找名称为' jdbc / ff-app&#39 ;;的JNDI DataSource嵌套异常是javax.naming.NoInitialContextException:需要在环境或系统属性或applet参数或应用程序资源文件中指定类名:java.naming.factory.initial       在org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)〜[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]       在org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)〜[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE]       ...省略了69个常用帧   引起:org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException:无法查找名称为' jdbc / ff-app&#39 ;;的JNDI DataSource嵌套异常是javax.naming.NoInitialContextException:需要在环境或系统属性或applet参数或应用程序资源文件中指定类名:java.naming.factory.initial       在org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup.getDataSource(JndiDataSourceLookup.java:48)〜[spring-jdbc-4.3.6.RELEASE.jar:4.3.6.RELEASE]       在org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration.dataSource(JndiDataSourceAutoConfiguration.java:62)〜[spring-boot-autoconfigure-1.5.1.RELEASE.jar:1.5.1.RELEASE]       at org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration $$ EnhancerBySpringCGLIB $$ 9509801a.CGLIB $ dataSource $ 0()〜........

我的POM.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>


    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
    </dependency>
</dependencies>

1 个答案:

答案 0 :(得分:0)

关键是当你尝试使用maven进行编译时,maven会尝试执行Junit测试;在你的情况下,你在src / resources / java中有一些单元测试,所以maven尝试执行它们。由于您使用的是JNDI数据源,这意味着servlet容器也必须处于活动状态才能执行测试,否则您将无法获得连接。

在这种情况下,当maven尝试执行测试时,可能没有servlet容器(因此,没有JNDI数据源)处于活动状态,并且您的测试会引发错误。

要解决此问题(并编译maven工件),您必须:

  • 或排除测试执行:这是通过在pom.xml中添加filenames来完成的。不会执行任何测试
  • 或忽略测试错误,这是通过在pom.xml中添加os.path.join(root, filename)来完成的。在这种情况下,将执行测试,但任何测试错误都不会停止maven编译

我给出的配置不仅告诉maven不执行测试,而且告诉maven不要停止任何测试错误

我希望我更清楚......我的英语不是最好的