2016-12-28 54 views
0

我有一個基本的Spring Boot項目,我試圖用RabbitMQ實現簡單的消息傳遞。當我添加彈簧引導起動AMQP依賴到我pom.xml文件,並開始春季啓動應用程序時,我得到java.lang.reflect.InvocationTargetException異常引起java.lang.StackOverflowErrorspring-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> 

如果我從pom.xml刪除spring-boot-starter-amqp依賴項,該項目可正常工作:

<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用於日誌記錄配置。如果您使用starters來組裝依賴關係,那意味着您必須排除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

如果您的意圖是通過RabbitMQ使用AMQP,請刪除所有JMS依賴項。

另外,對於一個簡單的應用程序,您也不需要Spring集成。嘗試只使用你的應用程序spring-boot-starter-amqp