自动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)你必须对依赖项文件夹执行相同操作
- Spring:获取某些接口和类型的所有Bean
- 带有Spring的EJB3
- Java Config @Bean未在其他@Configuration类中自动assembly
- spring – 如何自动连接数据源?
- 在Spring中,我可以从autowired bean中自动assembly新bean吗?
- Spring 3.2 Autowiregenerics类型
- Spring @Autowired vs使用’new’关键字创建Object
- @ServerEndpoint和@Autowired
- 无法自动assembly字段:private org.springframework.security.core.userdetails.UserDetailsService