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