Ich versuche zu bauen (innerhalb eines Application-Server läuft nicht), um eine eigenständige Anwendung mit Frühling und ich bin vor folgendes Problem:autowiring Klassen von externen Glas mit Frühling
Meine eigenständige Anwendung (Feder aktiviert) ist abhängig von einem anderen Projekt (gebündelt als Glas), das viele Dienste in com.application.service
enthält (mit @Service
versehen).
Es gibt keine Feder bezogene Konfiguration im externen Projekt und der Standalone-Kontext Anwendung ist sehr einfach, es enthält nur:
<context:component-scan base-package="com.application" />
Hier ist ein Beispiel der Klasse ist, die auf einen Dienst abhängt, wo‘ t erworben werden:
@Service
public class StandaloneService {
@Autowired
private SomeService someService;
// ...
}
StandaloneService
ist in der Standalone-Anwendung enthält, während SomeService
im äußeren Glas ist.
Der Fehler:
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)}
Hier ist, wie ich die ApplicationContext
bin zu schaffen und zu versuchen, meinen Dienst zu erwerben:
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
BeanFactory factory = (BeanFactory) context;
StandaloneService standalone = factory.getBean(StandaloneService.class);
}
Wie kann ich die Standalone-Anwendung baue:
<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>
Wie ich es betreibe (Was dazu führt zum Ausfall):
java -jar target/standalone.jar
Was seltsam ist, dass, wenn ich es auf diese Weise laufen funktioniert es:
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
Hat mir jemand helfen könnte herauszufinden, warum Frühlings Sehe meine externen Dienste im ersten Fall nicht?
EDIT
Dies ist aus der pom.xml des externen jar:
<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>
Wie erstellen Sie die externe JAR-Datei unter target/lib? Wenn Sie Eclipse verwenden, um das externe Jar zu erstellen, [[hier] (http://stackoverflow.com/questions/1242656/spring-annotation-based-controllers-not-working-if-it-is-inside-jar-file) und [hier] (http://stackoverflow.com/questions/4936295/auto-wiring-annotations-in-classes-from-pendent-jars) kann Ihnen helfen. –
Ich habe meine Frage mit dem relevanten Teil der pom.xml bearbeitet, die zum Erstellen des externen Jars verwendet wurde. Ich habe den '' Teil hinzugefügt, aber das ändert nichts an meinem Problem. Ich benutze nicht Eclipse, sondern Netbeans, aber ich möchte, dass dies außerhalb des Rahmens einer IDE funktioniert. –