spring项目打成可运行的jar后不能运行问题

时间:2022-05-31 09:40:05
当前spring3.2版本
项目一共2个类
Main
读取配置,获取service对象,调用方法。
Service
一个方法,简单输出。

2种方式,在eclipse中直接运行main都没问题

方式1:
使用配置式,把bean用xml方式写在配置文件中
把项目打成jar包后,直接运行,从main中可以获取service并且调用成功

方式2:

是不是spring注解在jar里面不能被识别?


使用注解式,在Service中使用@Component
把项目打成jar包后,不能运行,错误信息为:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [a.Serv] is defined: expected single bean but found 0:
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:271)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1101)
        at a.Main.main(Main.java:32)
        ... 5 more

7 个解决方案

#1


把你的代码和xml都贴出来。

#2




import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;


public class Main {
private static ApplicationContext context = null;
static final String[] path={"classpath:applicationContext.xml"};
    static final String[] classpath={"applicationContext.xml"};
    
    private static void init(){
        try {
            context = new FileSystemXmlApplicationContext(path);
        } catch (Exception e) {
            try {
                context = new FileSystemXmlApplicationContext(classpath);
            } catch (Exception e2) {
                try {
                    context = new ClassPathXmlApplicationContext(classpath);
                } catch (Exception e3) {
                    e3.printStackTrace();
                }
            }
        }
    }
    
public static void main(String[] args) {
init();
System.out.println(context==null);
((Serv)context.getBean(Serv.class)).t();
}
}




import org.springframework.stereotype.Component;



@Component
public class Serv {
public void t(){
System.out.println("sssssss");
}
}


application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:aop="http://www.springframework.org/schema/aop"  
xsi:schemaLocation="  
  http://www.springframework.org/schema/aop    
   http://www.springframework.org/schema/aop/spring-aop-2.0.xsd   
        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.0.xsd  
        http://www.springframework.org/schema/tx   
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
        http://www.springframework.org/schema/jdbc   
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd  
        http://www.springframework.org/schema/data/jpa   
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd  
        http://www.springframework.org/schema/jee   
        http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  
        ">


<context:annotation-config />
<aop:aspectj-autoproxy/>
<context:component-scan base-package="a" >
</context:component-scan>


<!-- <bean id="serv" class="a.Serv"></bean> -->


</beans>


#3


我试过了。没有问题啊。可以运行

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xsi:schemaLocation="  
         http://www.springframework.org/schema/aop    
          http://www.springframework.org/schema/aop/spring-aop-2.0.xsd   
        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.0.xsd  
        http://www.springframework.org/schema/tx   
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
        http://www.springframework.org/schema/jdbc   
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd  
        http://www.springframework.org/schema/data/jpa   
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd  
        http://www.springframework.org/schema/jee   
        http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  
        ">
 
 
    <context:annotation-config />
    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.wanmei.spring.test" >
    </context:component-scan>
     
     
    <!-- <bean id="serv" class="a.Serv"></bean> -->
     
     
</beans>


package com.wanmei.spring.test;

import org.springframework.stereotype.Component;

@Component
public class Serv {
    public void t(){
        System.out.println("sssssss");
    }
}


package com.wanmei.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Bootstrap {

/**
 * @param args
 */
public static void main(String[] args) {

String configLocation = "E:/workspace_java/test/src/com/wanmei/spring/test/applicationContext.xml";
ApplicationContext context = new FileSystemXmlApplicationContext(configLocation);
context.getBean(Serv.class).t();
}

}

#4


我是用eclipse导出的,export->runnable->package required
你是这种么

#5


引用 4 楼 student_2008 的回复:
我是用eclipse导出的,export->runnable->package required
你是这种么

嗯。我照着你说的样子做了测试。确实,存在你说的问题。具体问题我还没有找到。
不过,正如你说的:在eclipse中运行是正常的,eclipse导出之后就有问题了。应该是在eclipse运行时存在某个“eclipse的环境因素”,程序可以正常运行。经过eclipse导出之后,这个“环境因素”丢失了,就无法运行了。或者是eclipse的导出存在问题,也会导致这样的问题。
我也没有找到问题。如果你很着急的话,还是用spring的xml里面进行bean的配置吧,不采用“注释”的方式。
如果你的问题解决了,请在这里跟帖。我也很想知道为什么。谢谢!

#6


问题解决没?

#7


问题解决了 么?我也遇到这个问题

#1


把你的代码和xml都贴出来。

#2




import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;


public class Main {
private static ApplicationContext context = null;
static final String[] path={"classpath:applicationContext.xml"};
    static final String[] classpath={"applicationContext.xml"};
    
    private static void init(){
        try {
            context = new FileSystemXmlApplicationContext(path);
        } catch (Exception e) {
            try {
                context = new FileSystemXmlApplicationContext(classpath);
            } catch (Exception e2) {
                try {
                    context = new ClassPathXmlApplicationContext(classpath);
                } catch (Exception e3) {
                    e3.printStackTrace();
                }
            }
        }
    }
    
public static void main(String[] args) {
init();
System.out.println(context==null);
((Serv)context.getBean(Serv.class)).t();
}
}




import org.springframework.stereotype.Component;



@Component
public class Serv {
public void t(){
System.out.println("sssssss");
}
}


application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:aop="http://www.springframework.org/schema/aop"  
xsi:schemaLocation="  
  http://www.springframework.org/schema/aop    
   http://www.springframework.org/schema/aop/spring-aop-2.0.xsd   
        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.0.xsd  
        http://www.springframework.org/schema/tx   
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
        http://www.springframework.org/schema/jdbc   
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd  
        http://www.springframework.org/schema/data/jpa   
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd  
        http://www.springframework.org/schema/jee   
        http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  
        ">


<context:annotation-config />
<aop:aspectj-autoproxy/>
<context:component-scan base-package="a" >
</context:component-scan>


<!-- <bean id="serv" class="a.Serv"></bean> -->


</beans>


#3


我试过了。没有问题啊。可以运行

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xsi:schemaLocation="  
         http://www.springframework.org/schema/aop    
          http://www.springframework.org/schema/aop/spring-aop-2.0.xsd   
        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.0.xsd  
        http://www.springframework.org/schema/tx   
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
        http://www.springframework.org/schema/jdbc   
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd  
        http://www.springframework.org/schema/data/jpa   
        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd  
        http://www.springframework.org/schema/jee   
        http://www.springframework.org/schema/jee/spring-jee-3.0.xsd  
        ">
 
 
    <context:annotation-config />
    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="com.wanmei.spring.test" >
    </context:component-scan>
     
     
    <!-- <bean id="serv" class="a.Serv"></bean> -->
     
     
</beans>


package com.wanmei.spring.test;

import org.springframework.stereotype.Component;

@Component
public class Serv {
    public void t(){
        System.out.println("sssssss");
    }
}


package com.wanmei.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Bootstrap {

/**
 * @param args
 */
public static void main(String[] args) {

String configLocation = "E:/workspace_java/test/src/com/wanmei/spring/test/applicationContext.xml";
ApplicationContext context = new FileSystemXmlApplicationContext(configLocation);
context.getBean(Serv.class).t();
}

}

#4


我是用eclipse导出的,export->runnable->package required
你是这种么

#5


引用 4 楼 student_2008 的回复:
我是用eclipse导出的,export->runnable->package required
你是这种么

嗯。我照着你说的样子做了测试。确实,存在你说的问题。具体问题我还没有找到。
不过,正如你说的:在eclipse中运行是正常的,eclipse导出之后就有问题了。应该是在eclipse运行时存在某个“eclipse的环境因素”,程序可以正常运行。经过eclipse导出之后,这个“环境因素”丢失了,就无法运行了。或者是eclipse的导出存在问题,也会导致这样的问题。
我也没有找到问题。如果你很着急的话,还是用spring的xml里面进行bean的配置吧,不采用“注释”的方式。
如果你的问题解决了,请在这里跟帖。我也很想知道为什么。谢谢!

#6


问题解决没?

#7


问题解决了 么?我也遇到这个问题