2016-12-28 2 views
0

У меня есть базовый проект Spring Boot, в котором я пытаюсь реализовать простой обмен сообщениями с RabbitMQ. Когда я добавляю весну-загрузочного стартер-AMQP зависимостей в мой pom.xml файл и запустите приложение загрузки пружинной, я получаю java.lang.reflect.InvocationTargetException исключение, вызванное java.lang.StackOverflowError:причин зависимости Spring-boot-starter-amqp StackOverflowError

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    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:498) 
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) 
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) 
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) 
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58) 
Caused by: java.lang.StackOverflowError 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:280) 
    at org.apache.log4j.Category.<init>(Category.java:57) 
    at org.apache.log4j.Logger.<init>(Logger.java:37) 
    at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:43) 
    at org.apache.log4j.LogManager.getLogger(LogManager.java:45) 
    at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:63) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281) 
    at org.apache.log4j.Category.<init>(Category.java:57) 
    at org.apache.log4j.Logger.<init>(Logger.java:37) 
    at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:43) 
    at org.apache.log4j.LogManager.getLogger(LogManager.java:45) 
    at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:63) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281) 
    at org.apache.log4j.Category.<init>(Category.java:57) 
    at org.apache.log4j.Logger.<init>(Logger.java:37) 

pom.xml

<?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>rabbitmq.client</groupId> 
    <artifactId>rabbitmqFstClient</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>rabbitmqFstClient</name> 
    <description>Spring-Boot rabbitmq client</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.2.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-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

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

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jms</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.integration</groupId> 
      <artifactId>spring-integration-jms</artifactId> 
     </dependency> 

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

     <!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all --> 
     <dependency> 
      <groupId>org.apache.activemq</groupId> 
      <artifactId>activemq-all</artifactId> 
      <version>5.14.2</version> 
     </dependency> 
    </dependencies> 

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


</project> 

Если я удалю весеннюю загрузку-стартер-amqp зависимости от pom.xml, проект будет работать без ошибок:

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

ответ

1

Я не уверен, что он решит вашу проблему, но в любом случае у вас есть потенциальный конфликт, поскольку, согласно журналу, вы вытаскиваете зависимость log4J.
Если вы сделаете это, вы должны исключить Logback, который предоставляется по умолчанию при объявлении:

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

Вы можете проверить это, отображая дерево зависимостей проецирования и посмотрев, что тянет org.springframework.boot:spring-boot-starter-web:jar зависимости:

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.4.0.RELEASE:compile 
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.4.0.RELEASE:compile 
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.4.0.RELEASE:compile 
[INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.7:compile 
[INFO] | | | | +- ch.qos.logback:logback-core:jar:1.1.7:compile 
[INFO] | | | | \- org.slf4j:slf4j-api:jar:1.7.21:compile 
[INFO] | | | +- org.slf4j:jcl-over-slf4j:jar:1.7.21:compile 
[INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.21:compile 
[INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.21:compile 
[INFO] | | \- org.yaml:snakeyaml:jar:1.17:runtime 

Spring Boot заявляет, что он поддерживает Log4j 2 для входа конфигурации, если он находится на пути к классам. Если вы используете стартеры для сборки зависимостей, это означает, что вам нужно исключить Logback, а затем включить log4j 2.

Так использовать только log4j, можно исключить Logback из пружинной загрузки стартера веб-зависимость:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

Или использовать только Logback, вы должны исключить log4j, вероятно, запряженных одной из ваших объявленных зависимостей.
Использование: mvn dependency:tree из проекта Maven, чтобы узнать преступника.

Но в любом случае вы не должны использовать оба варианта.

1

Если вы планируете использовать AMQP через RabbitMQ, удалите все зависимости JMS.

Кроме того, для простого приложения вам также не нужна интеграция с пружиной. Попробуйте свое приложение, используя только spring-boot-starter-amqp