Autowiring Klassen aus externen jar mit Feder
Ich versuche zu bauen, ein standalone-Anwendung (nicht die Ausführung in einem application-server) mit dem Frühling und ich stehe vor dem folgenden problem :
Mein standalone-Anwendung (Frühjahr aktiviert) ist abhängig von einem anderen Projekt (im jar), die enthält eine Vielzahl von Dienstleistungen im com.application.service
(Kommentiert mit @Service
).
Gibt es keine Frühlings-bezogene Konfiguration in das externe Projekt-und der standalone-Anwendung Kontext ist sehr einfach, es enthält nur :
<context:component-scan base-package="com.application" />
Hier ist ein Beispiel einer Klasse, die hängt von einer Dienstleistung, die nicht angefordert werden kann :
@Service
public class StandaloneService {
@Autowired
private SomeService someService;
//...
}
StandaloneService
enthalten ist in der standalone-Anwendung, während SomeService
ist in der externen jar.
Den 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 bin, Erstellung der ApplicationContext
und versuchen, zu erwerben mein service :
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 Baue ich den standalone-Anwendung :
<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 bin, es läuft (führt zum Fehler) :
java -jar target/standalone.jar
Was merkwürdig ist ist, dass wenn ich es auf diese Weise 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
Wer könnte mir helfen herauszufinden, warum der Frühling nicht sehen kann, meine externe Dienstleistungen im ersten Fall ?
BEARBEITEN
Dies ist aus der pom.xml der externe 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 mit eclipse zu erstellen, die externe jar, here und die here kann Ihnen dabei helfen.
- Ich bearbeitet meine Frage mit den relevanten Teil des pom.xml erstellen Sie das externe jar. Ich fügte hinzu, die
<configuration>
Teil aber das ist nicht zu ändern alles, was zu meinem problem. Ich bin nicht mit eclipse sondern mit netbeans, aber ich will, dass das arbeiten aus einem beliebigen IDE-Bereich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Drei Monate später, habe ich nun die Antwort Dank dieser :
Anmerkung scan nicht Scannen externen jars im classpath
Wie bereits in der Antwort akzeptiert, wenn mit dem -jar option die -cp option ignoriert.
Läuft meine Anwendung auf diese Weise gemacht, es funktioniert wie erwartet !
Müssen Sie den Speicherort der externen jar-Datei als Teil der java-Befehl. Es wäre so etwas wie dieses
java -cp -jar target/standalone.jar
java -cp target/lib/external.jar -jar target/standalone.jar
aber ich bin noch immer der gleiche Fehler