2010-09-06 3 views
15

Sono in grado di compilare ed iniziare il mio progetto Spring utilizza Maven:eccezione di applicazione a partire Primavera da Java

mvn -e clean compile exec:java -Dexec.mainClass=de.fraunhofer.fkie.tet.vmware.manager.Test 

Tuttavia, quando monto tutte barattoli in un singolo file utilizzando il maven-assembly-plugin (compresi applicationContext.xml), ho sempre ottenere un Exception durante l'esecuzione java:

java -cp target/test-jar-with-dependencies.jar:. de.fraunhofer.fkie.tet.vmware.manager.Test 

    INFO: Loading XML bean definitions from class path resource [applicationContext.xml] 
    Sep 6, 2010 10:37:21 AM org.springframework.util.xml.SimpleSaxErrorHandler warning 
    WARNING: Ignored XML validation warning 
    org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/context/spring-context.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>. 
    ... 
    Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 
    Line 10 in XML document from class path resource [applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: 
    The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'. 
    ... 
    Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: 
    The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'. 

ho anche cercato di collegare le definizioni di schema, cioè spring-context.xsd ecc, direttamente al classpath, ma senza alcun successo.

less src/main/resources/applicationContext.xml 

    <?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context.xsd"> 

     <context:annotation-config /> <!-- wegen '@PostConstruct' --> 
    <!--<context:component-scan base-package="de.fraunhofer" />  --> 
    ... 
    </beans> 
+0

Puoi pubblicare il tuo applicationContext.xml - o almeno la sezione di intestazione. Sospetto che ci sia un problema con le intestazioni/riferimenti di dtd, ecc. –

+0

"applicationContext.xml" è pubblicato sopra. Sorprendentemente, l'applicazione funziona senza problemi, se 'mvn exec: java' è usato per avviarlo. – rmv

risposta

19

gestori namespace primavera vengono risolte utilizzando file /META-INF/spring.schemas e /META-INF/spring.handlers. Poiché i file con questi nomi esistono in diversi contenitori Spring, probabilmente solo uno di essi rimane nel barattolo di destinazione dopo maven-assembly-plugin.

Forse potresti unire questi file manualmente e in qualche modo configurare maven-assembly-plugin per sovrascrivere il file nel vaso di destinazione con questo file unito.

+2

Sì, hai ragione, è tutto! I file indipendenti '/META-INF/spring.handlers' da diversi jar si perdono nel jar finale. Di fronte a questo, decido di non usare il 'maven-assembly-plugin' per ora, ma includo tutti i jar manualmente dalla directory 'target/lib /' (dopo 'mvn install'), ad es. 'java -cp target/lib/spring-aop-3.0.4.RELEASE.jar: target/lib/spring-asm-3.0.4.RELEASE.jar: [...]: target/classes de.fraunhofer.fkie .tet.vmware.manager.Test'. Funziona come previsto. Grazie mille! ;-) – rmv

+3

@rmv Oppure puoi lasciare che il plugin di maven-dependency faccia la copia per te, come in [here] (http://stackoverflow.com/questions/574594/how-can-i-create-an- eseguibile-jar-con-le dipendenze-con-Maven/4323501 # 4323501) – staromeste

4

Sospetto che il file di configurazione di primavera manchi dello spazio dei nomi XML context. Va aggiunto l'elemento principale del file di configurazione di primavera come questo:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:annotation-config /> 
    <context:component-scan base-package="com.abc.xyz" /> 

</beans> 
+0

Grazie per la rapida risposta! Non ho pubblicato il mio file applicationContext.xml, perché 'mvn exec: java -Dexec.mainClass = de.fraunhofer.fkie.tet.vmware.manager.Test ' funziona correttamente. Quindi penso che non ci sia nulla di sbagliato nel file di configurazione in principal, in realtà contiene tutti gli elementi del tuo esempio sopra. Il problema si verifica quando provo ad avviare la versione assemblata direttamente da Java. – rmv

0

dipendenze Cosa primavera avete nel vostro pom? È possibile che si verifichino errori di analisi xml a causa di alcuni file jar primaverili che non si trovano sul percorso della classe. Nella primavera 3 la libreria è stata divisa in molti file jar. Scopri this post per vedere ciò che è necessario, in particolare:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-context</artifactId> 
    <version>${org.springframework.version}</version> 
</dependency> 
+0

Grazie per il suggerimento, ma 'spring-context.jar' è già assemblato in 'target/test-jar-with-dependencies.jar', cioè il vaso finale contiene 'org/springframework/context/config/spring-context- 3.0.xsd'. A proposito: siamo connessi con internet tramite un server proxy. È possibile che Maven utilizzi alcune impostazioni proxy a livello di sistema, mentre Java non è in grado di connettersi e controllare i documenti ".xsd" dal web? Aggiornamento – rmv

+0

: non ha nulla a che fare con problemi di proxy come ho verificato da un test eseguito a casa direttamente connesso a Internet. – rmv

3

Ho trovato il problema di root per questo come per la risposta di axtavt, e ho segnalato come un? Bug? in primavera: https://jira.springsource.org/browse/SPR-8368 - una soluzione alternativa per generare copie unite di questi file è inclusa qui. Ai posteri il codice è anche qui:

//IOUtils and FileUtils come from Apache Commons IO 
for(String s : new String[] {"spring.schemas", "spring.handlers", "spring.tooling"}) { 
    Enumeration<?> e = Test.class.getClassLoader().getResources("META-INF/"+s); 
    StringBuilder out = new StringBuilder(); 
    while(e.hasMoreElements()) { 
     URL u = (URL) e.nextElement(); 
     out.append(IOUtils.toString(u.openStream())).append("\n"); 
    } 
    File outf = new File(s); 
    FileUtils.writeStringToFile(outf, out.toString(), "UTF-8"); 
} 
1

Credo che ci sono 3 soluzioni a questo problema

  1. Il file jar tx dovrebbe essere incluso nel classpath/buildpath del progetto. (Errore più comune)
  2. citato da "axtavt" di cui sopra
  3. Prova questo prima soluzione "axtaxt": andare nella directory di guerra (specificata nella GWT di linguetta avanzata compilazione) e mettere il file primavera-tx.jar nella cartella lib cartella sotto la directory war, si aggiorna e si esegue nuovamente.
0

Come suggerisce c'è un problema con l'analisi in Richiesta o in Risposta. Questo errore può verificarsi se il client RestTemplate si aspetta un particolare tipo di risposta dalla risorsa, ma la risorsa restituisce qualcosa completamente. Ho ricevuto questo errore per un client POST RestTemplate correlato alla modifica della risposta restituita.

Ad es.RestTemplate iniziale che stava tornando un'Entità 'MyClass' cambiato e fissai tornare stringa in modo che il parser ha iniziato dando errore

ResponseEntity<MyClass> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, MyClass.class); 
MyClass postResponseBody = postResponseEntity.getBody(); 

cambiato in

ResponseEntity<String> postResponseEntity = restTemplate.postForEntity(postEndPoint, httpRequestEntity, String.class); 
String postResponseBody = postResponseEntity.getBody(); 

Come il tipo di risposta cambiato dall'entità alla stringa il parser iniziato dare errore durante l'elaborazione della risposta. Modificato per correggere il tipo di risposta (che nel mio caso era String) e ha iniziato a funzionare.