2016-08-20 3 views
1

Ich versuche derzeit, ein Beispiel-Spring-Projekt mit Gradle und IntelliJ IDEA (14.1.7) einzurichten. Die Spring-Konfiguration erfolgt über eine Klassenpfad-XML-Datei, die sich im Standardordner unter src/main/resources/ befindet.IntelliJ: Spring + Gradle + JUnit-Projekt funktioniert in der IDE

Die Gradle Build und Test funktioniert gut (von der Befehlszeile). Allerdings kann ich Run-Konfigurationen zum Testen und Ausführen innerhalb von IntelliJ nicht richtig einrichten: Ich bekomme immer Fehlermeldungen, wenn die XML-Datei nicht gefunden wird.

Verzeichnisstruktur:

(Project root) 
+- build 
    +- classes 
    +- main 
     +- (.class files) 
    +- test 
     +- (.class files) 
    +- resources 
    +- main 
     +- spring-config.xml (copied from /src/main/resources by Gradle) 
    +- ... 
+- src 
    +- main 
    +- java 
     +- test 
     +- sia 
      +- HelloApp.java 
      +- HelloService.java 
    +- resources 
     +- spring-config.xml 
    +- test 
    +- java 
     +- test 
     +- sia 
      +- SpringAppTests.java 
    +- resources 
     +- (empty directory) 
+- ... 

HelloApp.java:

package test.sia; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class HelloApp { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); 
     HelloService helloService = context.getBean(HelloService.class); 
     System.out.println(helloService.sayHello()); 
    } 
} 

SpringAppTests.java:

package test.sia; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

import static junit.framework.Assert.*; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:spring-config.xml") 
public class SpringAppTests { 
    @Autowired 
    private HelloService helloService; 

    @Test 
    public void testSayHello() { 
     assertEquals("Hello world!", helloService.sayHello()); 
    } 
} 

Die Laufkonfigurationen innerhalb IntelliJ laufen die classes und testClasses Gradle Aufgaben bzw. bef Erzstart. Classpath wird vom IntelliJ-Modul für das Projekt übernommen. Während die GUI für die Modulkonfiguration nichts bietet, um den Klassenpfad direkt festzulegen, können Sie nur die Pfade für die Compilerausgabe festlegen, die korrekt auf /build/classes/main und /build/classes/test gesetzt sind. Alle Quellen- und Ressourcenordner sind ordnungsgemäß im Projekt markiert.

Beim Versuch, Tests auszuführen:

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:27) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [spring-config.xml]; nested exception is java.io.FileNotFoundException: class path resource [spring-config.xml] cannot be opened because it does not exist 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadBeanDefinitions(AbstractGenericContextLoader.java:257) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:124) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:108) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:251) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
    ... 36 more 
Caused by: java.io.FileNotFoundException: class path resource [spring-config.xml] cannot be opened because it does not exist 
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330) 
    ... 48 more 

Wenn die Anwendung auszuführen versucht, sich selbst:

20.08.2016 20:54:11 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]6037fb1e: startup date [Sat Aug 20 20:54:11 CEST 2016]; root of context hierarchy 
20.08.2016 20:54:11 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [spring-config.xml] 
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [spring-config.xml]; nested exception is java.io.FileNotFoundException: class path resource [spring-config.xml] cannot be opened because it does not exist 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) 
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:612) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:513) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at de.julianrupp.sia.HelloApp.main(HelloApp.java:8) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: java.io.FileNotFoundException: class path resource [spring-config.xml] cannot be opened because it does not exist 
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330) 
    ... 18 more 

ich nur eine einzige 2 Jahre alte Frage in einer ähnlichen Sache gefunden haben, wo es war schlug vor, die Dateiverweise auf die XML-Konfigurationsdatei innerhalb der .java-Dateien so zu ändern, dass sie einen Platzhalter enthalten. Abgesehen von meiner Haltung, dass dies keine praktikable Lösung ist (ich könnte an Projekten arbeiten, wo ich diese Pfade nicht ändern kann), funktioniert es auch nicht für mich. Die Fehlermeldung ändert sich dann einfach und besagt, dass die Bean nicht gefunden werden kann.

Weiß jemand, wie man das richtig einrichtet?

+0

Schnappen Sie sich ein up-to-date-Version von IntelliJ, wählen Sie Datei - Öffnen ... und wählen Sie die build.gradle Datei, klicken Sie auf Weiter ein paar Mal, und Sie sollten durchgeführt werden. –

+0

@JBNizet 1) Die Version von IntelliJ ist behoben. 14.1.7 ist die neueste Version von v14. 2) Das Ausführen von Gradle-Tasks in IntelliJ ist nicht das Problem, das ich habe. Es führt die Anwendung und ihre Tests aus. – Julian

+0

vielleicht versuchen, es ohne intellij https: //www.mkyong zu bauen.com/gradle/gradle-create-java-project-struktur-automatisch/ –

Antwort

0

Es sieht so aus, als ob ich die Lösung endlich gefunden habe.

Für jemanden anderes mit dem gleichen Problem stecken -

ich explizit die Ressourcen und Testressourcen Ordner als „Bibliotheken mit Java-Klassen“ in den Projekteinstellungen hinzufügen musste, wie here beschrieben (es ist für IntelliJ v13, aber es funktioniert das gleiche in v14)

Siehe beigefügte Screenshots für die Konfiguration in den Projekteinstellungen.

Project Settings configuration