2013-07-17 9 views
7

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> 
+0

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

+0

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

Antwort

3

Drei Monate sein, ich habe jetzt die Antwort dank dieser: Annotation scan not scanning external jars in classpath

Wie in der akzeptierte Antwort angegeben, Bei Verwendung der Option -jar wird die Option -cp ignoriert.

Das Ausführen meiner Anwendung auf diese Weise hat es funktioniert wie erwartet!

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

Sie müssen den Speicherort der externen JAR-Datei als Teil des Java-Befehl angeben. Es würde später so etwas wie dieses

java -cp -jar Ziel/standalone.jar

+0

Ich habe es versucht: 'java -cp target/lib/external.jar -jar target/standalone.jar' aber ich bekomme immer noch den gleichen Fehler –

Verwandte Themen