2013-07-17 70 views
7

Tôi đang cố gắng để xây dựng một ứng dụng độc lập (không chạy bên trong một máy chủ ứng dụng) với mùa xuân và tôi đang phải đối mặt với vấn đề sau đây:lớp Autowiring từ jar bên ngoài với mùa xuân

ứng dụng độc lập của tôi (mùa xuân được kích hoạt) là tùy thuộc vào dự án khác (được đóng gói như một cái lọ) chứa nhiều dịch vụ trong com.application.service (Chú thích với @Service).

Không có cấu hình liên quan mùa xuân trong dự án bên ngoài và bối cảnh ứng dụng độc lập là rất đơn giản, nó chỉ chứa:

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

Dưới đây là một ví dụ về lớp mà phụ thuộc vào một dịch vụ mà có thể' t được mua lại:

@Service 
public class StandaloneService { 

    @Autowired 
    private SomeService someService; 

    // ... 
} 

StandaloneService được chứa trong các ứng dụng độc lập trong khi SomeService là trong jar bên ngoài.

Lỗi:

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

Sau đây là cách tôi tạo ApplicationContext và cố gắng để có được dịch vụ của tôi:

public static void main(String[] args) { 

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

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

Làm thế nào tôi đang xây dựng các ứng dụng độc lập:

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

Cách tôi chạy (Dẫn đến sự thất bại):

java -jar target/standalone.jar

gì là lạ là nếu tôi chạy nó theo cách này nó hoạt động:

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

Có ai có thể giúp tôi tìm ra lý do tại sao mùa xuân có thể không thấy các dịch vụ bên ngoài của tôi trong trường hợp đầu tiên?

EDIT

Đây là từ pom.xml của jar bên ngoài:

<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

Làm cách nào để tạo tệp jar bên ngoài trong mục tiêu/lib? Nếu bạn đang sử dụng nhật thực để tạo jar bên ngoài, [ở đây] (http://stackoverflow.com/questions/1242656/spring-annotation-based-controllers-not-working-if-it-is-inside-jar-file) và [ở đây] (http://stackoverflow.com/questions/4936295/auto-wiring-annotations-in-classes-from-dependent-jars) có thể giúp bạn. –

+0

Tôi đã chỉnh sửa câu hỏi của mình với phần có liên quan của tệp pom.xml được sử dụng để tạo jar bên ngoài. Tôi đã thêm phần '' nhưng điều này không thay đổi bất cứ điều gì cho vấn đề của tôi. Tôi không sử dụng nhật thực nhưng netbeans, nhưng tôi muốn điều này được làm việc trong phạm vi của bất kỳ IDE. –

Trả lời

3

Ba tháng sau, tôi bây giờ có nhờ phản ứng sau: Annotation scan not scanning external jars in classpath

Như đã nêu trong câu trả lời được chấp nhận, khi sử dụng tùy chọn -jar tùy chọn -cp bị bỏ qua.

Chạy ứng dụng của tôi theo cách này khiến nó hoạt động như mong đợi!

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

Bạn cần phải xác định vị trí của file jar bên ngoài như là một phần của lệnh java. Nó sẽ là một cái gì đó giống như

java -cp này mục tiêu -jar/standalone.jar

+0

Tôi đã thử điều này: 'java -cp target/lib/external.jar -jar target/standalone.jar' nhưng tôi vẫn gặp lỗi tương tự –