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