2013-07-17 11 views
7

Sto cercando di costruire un applicazione stand-alone (non in esecuzione all'interno di un application server) con la molla e sto di fronte al seguente problema:classi autowiring da vaso esterne con molla

La mia applicazione stand-alone (primavera abilitato) è a seconda di un altro progetto (in bundle come un jar) che contiene molti servizi in com.application.service (annotati con @Service).

Non c'è configurazione relative molla nel progetto esterno e il contesto applicativo autonomo è molto semplice, contiene solo:

<context:component-scan base-package="com.application" />

Ecco un esempio di classe che dipende da un servizio che può' t essere acquisite:

@Service 
public class StandaloneService { 

    @Autowired 
    private SomeService someService; 

    // ... 
} 

StandaloneService è contenuta nella domanda standalone mentre SomeService è nel contenitore esterno.

L'errore:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.application.SomeService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Ecco come sto creando il ApplicationContext e cercando di acquisire il mio servizio:

public static void main(String[] args) { 

    AbstractApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" }); 
    BeanFactory factory = (BeanFactory) context; 

    StandaloneService standalone = factory.getBean(StandaloneService.class); 
} 

Come sto costruendo l'applicazione stand-alone: ​​

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <index>true</index> 
      <manifest> 
       <classpathPrefix>./lib/</classpathPrefix> 
       <addClasspath>true</addClasspath> 
       <mainClass>com.application.Main</mainClass> 
      </manifest> 
     </archive> 
    </configuration> 
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
       <overWriteReleases>false</overWriteReleases> 
       <overWriteSnapshots>false</overWriteSnapshots> 
       <overWriteIfNewer>true</overWriteIfNewer> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Come lo sto eseguendo (Che porta al fallimento):

java -jar target/standalone.jar

Quello che è strano è che se corro in questo modo funziona:

mvn "-Dexec.args=-classpath %classpath com.application.Main" -Dexec.executable=/usr/lib/jvm/java-7-openjdk/bin/java -Dexec.classpathScope=runtime process-classes org.codehaus.mojo:exec-maven-plugin:1.2.1:exec

Qualcuno potrebbe aiutarmi a capire il motivo per cui molla può vedo i miei servizi esterni nel primo caso?

EDIT

Questo è dal pom.xml del vaso esterno:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <manifest> 
       <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
       <addClasspath>true</addClasspath> 
      </manifest> 
     </archive> 
    </configuration> 
</plugin> 
+0

Come si crea il file jar esterno in target/lib? Se utilizzi eclipse per creare il jar esterno, [here] (http://stackoverflow.com/questions/1242656/spring-annotation-based-controllers-not-working-if-it-is-inside-jar-file) e [qui] (http://stackoverflow.com/questions/4936295/auto-wiring-annotations-in-classes-from-dependent-jars) potrebbero aiutarti. –

+0

Ho modificato la mia domanda con la parte pertinente del pom.xml utilizzato per creare il vaso esterno. Ho aggiunto la parte '' ma questo non modifica nulla al mio problema. Non sto usando eclipse ma netbeans, ma voglio che questo funzioni da qualsiasi ambito dell'IDE. –

risposta

3

Tre mesi più tardi, ora ho le risposte grazie a questo: Annotation scan not scanning external jars in classpath

Come indicato nella risposta accettata, quando si utilizza l'opzione -jar l'opzione -cp viene ignorata.

L'esecuzione della mia applicazione in questo modo ha funzionato come previsto!

java -cp target/lib/external.jar:target/standalone.jar package.Main 
0

È necessario specificare la posizione del file jar esterni come parte del comando java. Sarebbe qualcosa di simile

java -cp obiettivo-jar/standalone.jar

+0

Ho provato questo: 'java -cp target/lib/external.jar -jar target/standalone.jar' ma sto ancora ricevendo lo stesso errore –