2013-07-17 17 views
7

Próbuję zbudować samodzielną aplikację (nie działa wewnątrz serwera aplikacji) z wiosny, a ja w obliczu następujący problem:klas autowiring od zewnętrznych słoju ze sprężyną

Moje autonomiczną aplikację (włączony wiosna) jest w zależności od innego projektu (w pakiecie jako słoik), który zawiera wiele usług w com.application.service (oznaczone adnotacją z @Service).

Nie ma konfiguracja wiosna związanych w projekcie zewnętrznym i samodzielna kontekst aplikacji jest bardzo prosty, zawiera tylko:

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

Oto przykład klasy, która zależy od usługi, która może” t nabyć:

@Service 
public class StandaloneService { 

    @Autowired 
    private SomeService someService; 

    // ... 
} 

StandaloneService jest zawarty w samodzielnej aplikacji podczas SomeService w słoiku zewnętrznego.

Błąd:

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)}

Oto jak ja tworzeniu ApplicationContext i próbuje zdobyć moją usługę:

public static void main(String[] args) { 

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

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

Jak buduję autonomiczną aplikację:

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

Jak to działa? (Co prowadzi do awarii):

java -jar target/standalone.jar

Co jest dziwne jest to, że jeśli uruchomię to w ten sposób to działa:

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

Czy ktoś może mi pomóc dowiedzieć się, dlaczego sprężyna może nie widzisz moich usług zewnętrznych w pierwszym przypadku?

EDIT

To z pom.xml słoika zewnętrznej:

<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

Jak utworzyć zewnętrzny plik jar pod target/lib? Jeśli używasz środowiska Eclipse do utworzenia zewnętrznego słoika, [tutaj] (http://stackoverflow.com/questions/1242656/spring-annotation- based-controllers-not-working-if-it-is-inside-jar-file) i [tutaj] (http://stackoverflow.com/questions/4936295/auto-wiring-annotations-inclasses-from-dependent-jars) mogą ci pomóc. –

+0

Edytowałem moje pytanie z odpowiednią częścią pom.xml używaną do tworzenia zewnętrznego słoika. Dodałem część '', ale to nie zmienia niczego w moim problemie. Nie używam Zaćmienie, ale netbeans, ale chcę, aby to działało z dowolnego zakresu IDE. –

Odpowiedz

3

Trzy miesiące później, teraz mam odpowiedź dzięki temu: Annotation scan not scanning external jars in classpath

Jak stwierdzono w przyjętym odpowiedź podczas korzystania z opcji -oat opcja jest ignorowana.

Uruchamianie aplikacji w ten sposób działało zgodnie z oczekiwaniami!

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

musisz określić lokalizację zewnętrznego pliku jar jako część polecenia java. To byłoby coś takiego

java -jar docelowego cp/standalone.jar

+0

Próbowałem tego: 'java -cp target/lib/external.jar -jar target/standalone.jar' ale nadal otrzymuję ten sam błąd –

Powiązane problemy