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>
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. –
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. –