0

我遇到了一个问题,我编写了一个相当简单的 Spring Boot 应用程序,它使用它的嵌入式 Tomcat 容器运行得很好。现在我必须将它部署到我组织的 Glassfish (v3.1.2) 并遇到臭名昭著的“SLF4J:您的 slf4j 绑定请求的 1.6 版与 [1.5.5, 1.5.6] 不兼容”-错误。我还尝试将相同的应用程序部署到具有相同问题的独立 Tomcat。


免责声明:我绝不是 Maven 和 Spring-Boot 方面的专家;但是我已经用谷歌搜索并进行了实验,直到我脸色发青并且不确定发生了什么。一些指导将不胜感激。


所以我下载了 Spring-Boot 示例应用程序“gs-convert-jar-to-war”(https://github.com/spring-guides/gs-convert-jar-to-war),它部署得很好。

因此,我尝试简单地将 spring-ldap-test 添加到我的依赖项中,但它不会部署。

我的 POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.springframework</groupId>
<artifactId>gs-convert-jar-to-war</artifactId>
<version>0.1.0</version>
<packaging>war</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.0.0.RC5</version>
</parent>

<dependencies>


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


    <!-- <dependency>
      <groupId>org.springframework.ldap</groupId>
      <artifactId>spring-ldap-test</artifactId>
      <version>2.0.1.RELEASE</version>        
    </dependency> -->


</dependencies>

<properties>
    <start-class>hello.Application</start-class>
</properties>

<build>
    <plugins>
        <plugin> 
            <artifactId>maven-compiler-plugin</artifactId> 
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>http://repo.spring.io/libs-snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>http://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
    <pluginRepository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>http://repo.spring.io/libs-snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>
</project>

现在,这部署得很好......除了关于容器无法找到一堆我没有使用的东西(Mongo,Spring Batch 等)的奇怪错误。我不确定这些是关于什么的,但该应用程序确实部署了。如果有人知道这些是什么以及如何摆脱它们,我会喜欢反馈!这些错误与此类似:

[#|SEVERE|glassfish3.1.2|类 [com/mongodb/Mongo] 未找到。加载 [ class org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration ]|#] 时出错

不过,就像我说的那样,该应用程序确实可以很好地部署这些错误;这不是我问题的症结所在。

真正的问题是现在我去取消注释 spring-ldap-test 依赖项并尝试再次部署应用程序。然而,这一次没有部署。在尝试部署结束时,我看到了这个错误(为了便于阅读,删除了一些细节):

[#|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6]|#]

那么这里发生了什么?我包含了一个依赖项 Spring-LDAP-Test,突然之间,SLF4J 的一切都变得一团糟,我的应用程序无法部署?

这是我的 Maven 依赖图(针对 SLF 过滤):

localHost:complete butah$ mvn dependency:tree -Dincludes="*slf*"
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building gs-convert-jar-to-war 0.1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gs-convert-jar-to-war ---
[INFO] org.springframework:gs-convert-jar-to-war:war:0.1.0
[INFO] +- org.springframework.boot:spring-boot-starter-thymeleaf:jar:1.0.0.RC5:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-web:jar:1.0.0.RC5:compile
[INFO] |  |  \- org.springframework.boot:spring-boot-starter:jar:1.0.0.RC5:compile
[INFO] |  |     \- org.springframework.boot:spring-boot-starter-logging:jar:1.0.0.RC5:compile
[INFO] |  |        +- org.slf4j:jul-to-slf4j:jar:1.7.6:compile
[INFO] |  |        \- org.slf4j:log4j-over-slf4j:jar:1.7.6:compile
[INFO] |  \- org.thymeleaf:thymeleaf-spring4:jar:2.1.2.RELEASE:compile
[INFO] |     \- org.slf4j:slf4j-api:jar:1.7.6:compile
[INFO] \- org.springframework.ldap:spring-ldap-test:jar:2.0.1.RELEASE:compile
[INFO]    \- org.springframework.ldap:spring-ldap-core:jar:2.0.1.RELEASE:compile
[INFO]       \- org.springframework.data:spring-data-commons:jar:1.7.1.RELEASE:compile
[INFO]          \- org.slf4j:jcl-over-slf4j:jar:1.7.6:compile

注意:我正在尝试将其部署到 GF 的全新库存安装中。我唯一改变的是我确实定义了一些 JNDI 的东西。

根据我的 maven 依赖关系图,1.7.6 中使用的唯一 SLF4J 东西——但我的日志声称混合中有一个 1.5.5/6 版本。这可能来自哪里,我该如何杀死它?我的想法可能是它在 spring-ldap-test 中——但如果是这样,那不应该出现在我的图表中吗?

我不知所措。我希望你们中的一些 Spring-Boot 专家可以帮助我开始我的组织的第一个 Spring-Boot 项目。

:)

4

1 回答 1

1

因此,不是 Maven 或 SpringBoot 专家,而是从一个系统管理员那里得到一个提示,他指出 Spring-Ldap-Test 依赖于 ApacheDS-ALL,而该项目又依赖于 SLF4J 的东西。一旦他从 WAR 中的 ApacheDS jar 中删除了 SLF4J 内容,它就可以正常部署。

所以这让我想起了我以前在另一个 Apache 项目上看到过类似的 SLF4J 问题...... ApacheMQ。我了解到 ApacheMQ-ALL “隐藏”了它们对 SLF4J 的依赖,这会导致版本冲突。在这种情况下,我没有将 ApacheMQ-ALL 声明为我的依赖项,而是声明了我需要的特定 ApacheMQ 模块。那行得通。

在这种情况下,我不能这样做,因为我的项目不是依赖于 ApacheDS-ALL,而是依赖于 Spring-Ldap-Test(谁依赖于 ApacheDS-ALL)。所以我所做的是明确声明我对 ApacheDS-ALL 的依赖,但使用更新的版本(恰好选择了兼容的更新的 SLF4J)。

换句话说,我的 POM 现在有这个:

    <!-- NOTE: Spring-Ldap-Test includes ApacheDS-ALL but this
         version gets ApacheDS 1.5.5 and ApacheDS-ALL "shades"
         in SLF4J, which can cause conflicts if your project is
         using a different version of SLF4J elsewhere.
     -->
    <dependency>
      <groupId>org.springframework.ldap</groupId>
      <artifactId>spring-ldap-test</artifactId>
      <version>2.0.1.RELEASE</version>                
    </dependency>
    <!-- Explicitly declare a newer version of ApacheDS-ALL in order to
         inherit a newer version of SLF4J because Spring-Ldap-Test was
         using an older SLF4J and that was conflicting with the newer
         version in use by Spring-Boot   
     -->
    <dependency>
        <groupId>org.apache.directory.server</groupId>
        <artifactId>apacheds-all</artifactId>
        <version>2.0.0-M16</version>
    </dependency> 

我不知道这是否是理想的解决方案,但它似乎确实有效。如果有人比我更有知识,我将不胜感激。

就个人而言,我现在已经两次被 Apache 的“ALL”项目所困扰,我认为这很糟糕。我不知道他们为什么选择制作这些,但我认为如果他们要这样做,他们应该有很大的免责声明来告诉其他图书馆建设者不要使用那个版本。

而且似乎 Spring-ldap-test 不应该使用该模块。

于 2014-04-02T22:19:07.017 回答