2015-02-24 30 views
0

我正在开发一个使用外部罐子依赖性的弹簧命令行应用程序。当我从eclipse运行应用程序时,它完美地工作,但是当我将它作为可运行jar导出时,它无法自动调用子包中的依赖关系。但是,如果我在spring-context中编写每个bean定义,那么它就可以工作。它有什么问题?是@Component不工作或component-scan base package还是别的?无法扫描子包中的组件 - 弹簧罐

这里是弹簧的context.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 


    <context:property-placeholder location="classpath*:/connection.properties, classpath*:/log4j.properties" /> 
    <import resource="classpath*:/sm-service-context.xml" /> 

    <context:annotation-config /> 
    <context:component-scan base-package="com.hca.sm.migration" /> 

    <bean class="com.hca.sm.migration.MigrationController" /> 

</beans> 

更新:ERROR堆栈跟踪:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.hca.sm.migration.MigrationController#0': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected com.hca.sm.migration.soap.util.SOAPMessageUtil com.hca.sm.migration.MigrationController.soapMessageUtil; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.hca.sm.migration.soap.util.SOAPMessageUtil] 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)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at com.hca.sm.migration.SMMigrationApp.main(SMMigrationApp.java:39) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected com.hca.sm.migration.soap.util.SOAPMessageUtil com.hca.sm.migration.MigrationController.soapMessageUtil; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.hca.sm.migration.soap.util.SOAPMessageUtil] 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)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    ... 18 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.hca.sm.migration.soap.util.SOAPMessageUtil] 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)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
    ... 20 more 
ERROR [main] (SMMigrationApp.java:17) - org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.hca.sm.migration.MigrationController#0': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected com.hca.sm.migration.soap.util.SOAPMessageUtil com.hca.sm.migration.MigrationController.soapMessageUtil; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.hca.sm.migration.soap.util.SOAPMessageUtil] 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)} 

MigrationController.java:

package com.hca.sm.migration; 

import java.util.List; 
import javax.annotation.PostConstruct; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
/* other imports */ 

@Component 
public class MigrationController extends AbstractEntityUtil { 

    private static final Logger logger = Logger.getLogger(MigrationController.class.getName()); 

    @Autowired 
    protected SOAPMessageUtil soapMessageUtil; 

    @Autowired 
    protected SOAPGroupUtil soapGroupUtil; 

    @Autowired 
    protected SOAPMessageThreadUtil soapMessageThreadUtil; 

    @Autowired 
    protected RestServiceUtil restServiceUtil; 

    private SecureMail connectionPort = null; 
    private GroupList groupList = null; 

    @PostConstruct 
    public void init() { 
     connectionPort = soapConnectionUtil.getSOAPConnection(); 
    } 

    public void migrateOldSmToNew(String clientId, String dryRun) { 
     groupList = soapGroupUtil.getListOfGroupsByClientId(clientId, connectionPort) ; 

     /* other logic*/ 

    } 
} 

我的主类是从我这里打电话控制器:

package com.hca.sm.migration; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.stereotype.Component; 

@Component 
public final class SMMigrationApp { 

    public static void main(String[] args) { 
     String clientId = "dc=ihcs,dc=com"; 
     String dryRun = "true"; 

     try { 
      ApplicationContext smApplicationContext = new ClassPathXmlApplicationContext("classpath*:/SM-MigrationApplicationContext.xml"); 
      // migration 
      MigrationController migrationController = (MigrationController) smApplicationContext.getBean(MigrationController.class.getName()); //here is error 
      migrationController.migrateOldSmToNew(clientId, dryRun); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+0

请问您可以添加错误堆栈跟踪? – Mithun 2015-02-24 07:11:22

+0

您可以尝试检查Eclipse启动的进程的命令行来运行您的应用程序,并查找与用于运行可运行jar的命令的区别。 – 2015-02-24 08:57:22

+0

你可以发布你的MigrationController吗? – 2015-02-24 09:23:03

回答

0

OKAY!因此,在大量挖掘之后,我选择了另一种方法将我的应用程序打包为可运行的jar,并且它为我工作。但是我仍然不明白为什么component-scan-base package在这种情况下不起作用。我认为它必须采用maven组装jar和.classpath内部menifest.mf的方式做些事情。所以我建议,如果有人是有以下插件这样的问题用途:

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>1.2.2.RELEASE</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>repackage</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

这是最简单的方法来创建独立运行的JAR,其中包括所有的依赖关系。

要在控制台编译和打包运行Maven命令:

mvn clean package 

要在控制台运行jar:

java -jar jarName.jar 

希望这有助于我这样的人!!!!