自动assemblySpring 3.2独立应用程序失败

这是我第一次在stackoverflow上找不到解决问题的方法:

我正在尝试创建一个带有基于注释的自动assembly的可执行jar独立应用程序,但我无法获得可运行的jar文件(从Eclipse导出为可运行的JAR文件)来完成它的工作。 它确实直接从Eclipse运行为Java应用程序,而不是通过控制台> java -jar test.jar作为独立应用程序运行。

 Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'handler': Injection of autowired dependen cies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.serv ice.UserService com.example.controller.TestHandler.userService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionEx ception: No qualifying bean of type [com.example.service.UserService] found for dependency: expected at least 1 bean which qualifies as auto wire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBe anPostProcessor.java:288) 

我尝试通过遵循此博客中描述的“手动初始化自动assembly”模式来避免此类问题: http ://sahits.ch/blog/?p = 2326无效。 请注意,我也使用没有persistence.xml的Hibernate JPA(因此) – 并且不会受到我使用的两个数据库的阻碍,它在Eclipse中运行时工作正常。

Main.java:

 public class Main { @Autowired private TestRunner testRunner; public Main() { final ApplicationContext context = new ClassPathXmlApplicationContext("app-context.xml"); AutowireCapableBeanFactory acbFactory = context.getAutowireCapableBeanFactory(); acbFactory.autowireBean(this); } public static void main(String[] args) throws Exception { Main main = new Main(); main.testRunner.run(); } } 

TestRunner.java:

 @Component public class TestRunner { @Autowired Handler handler; public void run() { handler.doTest(); } } 

TestHandler.java(groupId和groupName将在稍后阶段设置):

 @Controller public class TestHandler implements Handler { private static Log syslog = LogFactory.getLog(TestHandler.class); @Autowired private UserService userService; @Autowired private GroupService groupService; private Long groupId; private String groupName; public void doTest() { if (groupId != null) { List users = userService.loadUsersByGroupId(groupId); syslog.debug("Amount of users found: " + users.size()); } else { syslog.debug("groupId is null"); } if (groupName != null) { List groups = groupService.loadGroupsByName(groupName); syslog.debug("Amount of groups found: " + groups.size()); } else { syslog.debug("groupName is null"); } } public void setGroupId(Long groupId) { this.groupId = groupId; } public void setGroupName(String groupName) { this.groupName = groupName; } } 

UserServiceImpl.java:

 @Service public class UserServiceImpl implements UserService { @Autowired UserDAO userDAO; @Override public List loadUsersByGroupId(long id) { return userDAO.findAllByGroupId(id); } ... 

UserDAOImpl.java:

 @Repository @Transactional("db1") public class UserDAOImpl implements UserDAO { @PersistenceContext(unitName="entityManagerDb1") private EntityManager em; @SuppressWarnings("unchecked") @Override public List findAllByGroupId(long id) { Query query = em.createQuery("select distinct u from User u " + "where u.groupId = :groupId"); query.setParameter("groupId", id); return query.getResultList(); } ... 

app-context.xml(使用注释配置的JPA,使用两个dbs):

                      com.example.domain.db1            org.hibernate.dialect.MySQL5InnoDBDialect true validate true UTF-8 true                          com.example.domain.db2            org.hibernate.dialect.MySQL5InnoDBDialect true validate true UTF-8 true          

让我疯狂的是,在Eclipse中运行它只是按预期工作。 Eclipse导出function是否有限? 有关创建可运行jar文件的其他框架的任何提示吗?

如果它是从eclipse运行而不是从导出的jar文件运行,则导出是一个问题

在导出窗口中有一个复选框,说明Add directory entries ,应该检查组件扫描是否有效

当您在Eclipse中运行它时,所有Spring依赖项和其他依赖项都会加载到您的类路径中,但是当您将应用程序导出为jar时,只会导出您的类,而不是依赖项类。

通常有两种方法可以实现一个立式jar子。 你可以创建一个’超级jar’(参见是否可以创建一个包含项目类和项目依赖项的“uber”jar作为带有自定义清单文件的jar? ),其中所有依赖jar都扩展为一个jar。 然而,这种方法可能有风险,因为如果jar子具有相同的文件名(例如:META-INF内的相同配置文件),它们可以相互覆盖

另一个更合适的方法是使用maven-dependency-plugin(请参阅dependency:copy)将所有依赖项复制到文件夹“dependencies”中。 然后运行你的jar子

 java -cp "myjar.jar;dependencies/*" org.mycompany.MainClass 

这不是一个独立的jar,而是一个独立的文件夹。 缺点是每次添加/删除依赖项(例如:来自maven)你必须对依赖项文件夹执行相同操作