2015-01-29 3 views
21

Ich spiele sur die Frühlings-Boot-Führung die ersten Schritte, aber die automatische Konfiguration fehlschlägt, und ich bekomme:Frühlings-Boot-GS: ComponentScan und ClassNotFoundException für ConnectionFactory-

java.lang.ClassNotFoundException: javax.jms.ConnectionFactory 

Es scheint es aufgrund der Lage der Application-Klasse ist . Wo sollte es liegen? Im Paket der obersten Ebene (src/main/java) oder in einem bestimmten Paket?

+0

Haben Sie alle Abhängigkeiten überprüft? –

Antwort

-1

Ihre Konfiguration sollte wie folgt aussieht und die Application.java an der Wurzel Sie sollten Pakete Eg/src/main/java/io/eddumelendez

io.eddumelendez ist mein Paket

<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> 
    <parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.2.1.RELEASE</version> 
    <relativePath /> 
    </parent> 
    <groupId>io.eddumelendez.jms</groupId> 
    <artifactId>spring-boot-jms-sample</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>qa</name> 
    <url>http://maven.apache.org</url> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jms</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.activemq</groupId> 
     <artifactId>activemq-broker</artifactId> 
    </dependency>   
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
    </dependency> 
    </dependencies> 

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

</project> 
+0

Die Antwort wurde aktualisiert –

72

Ihre Klasse Application sollte in einem bestimmten Paket und nicht im Standardpaket (oberste Ebene) platziert werden. Zum Beispiel, setzen Sie es in com.example und legen Sie Ihren gesamten Anwendungscode in diesem Paket oder in Unterpaketen wie com.example.foo und com.example.bar.

Platzieren Sie Ihre Application Klasse im Standardpaket, das heißt direkt in src/main/java ist keine gute Idee, und es wird mit ziemlicher Sicherheit dazu führen, dass Anwendung zu starten scheitern. Wenn Sie dies tun, sollten Sie diese Warnung sehen:

** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package. 
+0

Ihre Antwort löst das Problem, aber es wäre gut zu wissen, warum dies "keine gute Idee" ist, da es für mich egal ist, wo die Anwendungsklasse ist. –

+2

Das Scannen von Komponenten untersucht das Paket, in dem sich Ihre Hauptanwendungsklasse und alle Unterpakete befinden. Wenn Sie es im Standardpaket platzieren, wird jedes einzelne Paket im Klassenpfad gescannt. Im besten Fall ist das eine Zeitverschwendung. Im schlimmsten Fall wird Ihre Anwendung nicht starten, da sie Komponenten findet, die sie nicht gefunden haben sollte. –

+0

Zeitverschwendung und zu viel zu finden wäre immer noch ein besserer Fall als [ClassNotFoundException], der anscheinend nichts gefunden hat. Noch mehr ging ich Spring Dokument über, wo die Application-Klasse und es heißt buchstäblich "Wir empfehlen, dass Sie Ihre Hauptanwendungsklasse in einem Root-Paket suchen" (http://docs.spring.io/spring-boot/docs /current/reference/html/using-boot-structuring-your-code.html). Fehle ich etwas oder ist das absichtlich irreführend? –

0

Sie die Hauptklasse müssen in einem Paket sein. Da die Spring-Boot-Annotation @SpringBootApplication nach einem zu scannenden Paket sucht, während sie die App startet.

Also stellen Sie sicher, dass es eine Paketanweisung über Ihrer Hauptklassendatei gibt. Das ist es.

0

Ich hatte das gleiche Problem, Bald erkannte ich, dass ich meine MAIN-Methode nicht im Paket enthalten hatte. Nach dem Einschließen der Haupteinheit in das Paket wurde der Spring Boot ohne Pannen ausgeführt.

Beispielprogramm (Basic) -

package springbootquickstart; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 

public class application { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     SpringApplication.run(application.class, args); 

    } 

} 
+0

verknüpft haben Sie können Ihren Code besser formatieren, indem Sie vier Leerzeichen vor jeder Zeile hinzufügen. – ailnlv

+0

@ailnlv, Danke, "T-Heron hat es getan, wird dies in Zukunft berücksichtigen –

2

Legen Sie das bootup Anwendungsklasse nicht in Standard-Paket. Dies wird das Problem lösen.

Arbeitscode:

package com.spring.boot.app; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
public class App { 
    public static void main(String[] args) { 
     SpringApplication.run(App.class, args);   

    } 
} 
Verwandte Themen