Code Bye

spring3 mvc使用注解方式时,不能扫描jar包里面的类

如题,在线回复,求大神。晚上有很多人都遇到了,说是用eclipse导出时选择Add directory entries选项,如这个贴:http://yizhilong28.iteye.com/blog/1146830,这个帖子下面说用这个方法:
在maven下,打包时需要指定添加
Java代码  收藏代码
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>  
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>  

我也试过了,不好用。还是扫描不到,在线等啊大神们

贴出你的Spring配置, 和mvc注解配置
现在框架是springMVC+maven,maven打包成功,里面也有jar,但启动tomcat报错,说扫描不到我的service,下面这个方法在myclipse中没有这种配置
引用 1 楼 shijing266 的回复:

贴出你的Spring配置, 和mvc注解配置

大神,我在myeclipse中运行项目,启动没问题,就是打成war包后,再启动tomcat才报错的。

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	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.0.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

	<!-- 自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 
		不推荐使用的配置,对自定义拦截器使用起来不方便
		 <mvc:annotation-driven /> 
	-->


	<!-- 自定义拦截器配置手动配置更灵活,可以从拦截器中获取想要的类名,方法名等信息推荐使用,而且这种配置 只拦截@Controller,不需要在拦截器中过滤静态文件 -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
		<property name="interceptors">
			<list>
			</list>
		</property>
	</bean>


	<!-- 这里手动注册springmvc的注解依赖,可以灵活配置  -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
			<ref bean="textHttpMessageConverter"/>
			<ref bean="jsonHttpMessageConverter"/>
  
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>  
  
            <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>  
  
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>  
  
            <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> 
            <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> 
			</list>
		</property>

		<property name="webBindingInitializer"> 
		  <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
		  </bean> 
		</property>
	</bean>

	<!-- <context:annotation-config/>  -->

	<!-- 实现 RESTful的风格,显示指定需要转换的响应格式类型 -->
	<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller" />
	<!-- xml -->
	<bean id="xmlMessageConverter"
		class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
		<constructor-arg ref="xstreamMarshaller" />
		<property name="supportedMediaTypes" value="application/xml" />
	</bean>

	<!-- json -->
	<bean id="jsonHttpMessageConverter"
		class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="prefixJson" value="false" />
		<property name="supportedMediaTypes">
			<list>
				<value>text/html;charset=UTF-8</value> 
			</list>
		</property>
	</bean>
	<!-- text -->
	<bean id="textHttpMessageConverter" 
		class="org.springframework.http.converter.StringHttpMessageConverter">
		<property name="supportedMediaTypes">
				<list>
					<value>text/plain;charset=UTF-8</value>
				</list>
		</property>
	</bean>

	<!-- 静态文件 -->
	<mvc:resources mapping="/css/**" location="/css/" />
	<mvc:resources mapping="/js/**" location="/js/" />


	<!-- 需要扫描的标注了@Controller的类 -->
	<context:component-scan base-package="com.jfpal">
		<context:include-filter type="regex"
			expression=".*.*.action.*" />
			<!-- 这里排除service,防止事务失效 -->
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> 
	</context:component-scan>


	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix">
			<value>/jsp/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

	<!-- 文件上传  -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="1024000000"></property>
		<property name="defaultEncoding" value="utf-8"></property>  
	</bean>


</beans>

我直接贴代码吧。 你照着看下就知道

你是怎么测试的? 如果是web环境中,先去tomcat中项目的lib下面确认这个jar是否已经存在。

如果存在这个jar, 那看看你spring mvc的配置是怎样的, 你具体是要扫描哪些注解类?

我在使用spring过程中, 很多带注解的类也都是在依赖jar中, 只要路径配置正确,不存在扫描不到的情况。

引用 3 楼 liubingjunws 的回复:

大神,我在myeclipse中运行项目,启动没问题,就是打成war包后,再启动tomcat才报错的。

这个我不清楚,我倒是弄过 tomcat正常,weblogic启动不行,说是说找不到类

问题根源就是:配置自动扫描的时候,路径太短了,我配置的com , weblogic也有com包,先扫描weblogic导致包冲突找不到类,  然后我多加一级包路径 改成com.jfpal就行了

@shijing266
我的配置保证没错的。因为直接在myeclipse中部署,运行都OK。
就是将项目打包成war包后,放到tomcat中,启动报错。
引用 2 楼 liubingjunws 的回复:

现在框架是springMVC+maven,maven打包成功,里面也有jar,但启动tomcat报错,说扫描不到我的service,下面这个方法在myclipse中没有这种配置

如果war包打出来是正确的,那么一定是你的配置有问题!

扫描路径配置的是*
引用 8 楼 whos2002110 的回复:
Quote: 引用 2 楼 liubingjunws 的回复:

现在框架是springMVC+maven,maven打包成功,里面也有jar,但启动tomcat报错,说扫描不到我的service,下面这个方法在myclipse中没有这种配置

如果war包打出来是正确的,那么一定是你的配置有问题!

war包中确实有jar,但就是扫描不到,各种郁闷。、、

引用 10 楼 liubingjunws 的回复:
Quote: 引用 8 楼 whos2002110 的回复:
Quote: 引用 2 楼 liubingjunws 的回复:

现在框架是springMVC+maven,maven打包成功,里面也有jar,但启动tomcat报错,说扫描不到我的service,下面这个方法在myclipse中没有这种配置

如果war包打出来是正确的,那么一定是你的配置有问题!

war包中确实有jar,但就是扫描不到,各种郁闷。、、

把异常贴出来看下

http://www.iteye.com/topic/1126642
引用 5 楼 whos2002110 的回复:

你是怎么测试的? 如果是web环境中,先去tomcat中项目的lib下面确认这个jar是否已经存在。

如果存在这个jar, 那看看你spring mvc的配置是怎样的, 你具体是要扫描哪些注解类?

我在使用spring过程中, 很多带注解的类也都是在依赖jar中, 只要路径配置正确,不存在扫描不到的情况。

项目A是web项目,项目b是jar,项目A引用了项目b,在myeclipse中 运行项目A,没问题。
现在将项目A 打包成war,将war放在tomcat中,启动tomcat,报错。jar中所有的service都没扫描到。

引用 13 楼 liubingjunws 的回复:
Quote: 引用 5 楼 whos2002110 的回复:

你是怎么测试的? 如果是web环境中,先去tomcat中项目的lib下面确认这个jar是否已经存在。

如果存在这个jar, 那看看你spring mvc的配置是怎样的, 你具体是要扫描哪些注解类?

我在使用spring过程中, 很多带注解的类也都是在依赖jar中, 只要路径配置正确,不存在扫描不到的情况。

项目A是web项目,项目b是jar,项目A引用了项目b,在myeclipse中 运行项目A,没问题。
现在将项目A 打包成war,将war放在tomcat中,启动tomcat,报错。jar中所有的service都没扫描到。

首先A,b两个项目是否同为一个项目的不同模块, 我估计你的不是, 那么在ide里面你如果修改了b中的代码,比如加了注解,加了类,直接启动是能即使生效的。  但是打包的时候,如果不是具有相同的父项目,则新代码需要重新打包安装的本地maven中, 也就是你要先把b项目install到本地, 然后再打包A,这是的war才具有最新的代码。

不晓得你明白我的意思没, 你尝试用反编译工具看下你当前war下面的jar是否是最新的代码

引用 14 楼 whos2002110 的回复:
Quote: 引用 13 楼 liubingjunws 的回复:
Quote: 引用 5 楼 whos2002110 的回复:

你是怎么测试的? 如果是web环境中,先去tomcat中项目的lib下面确认这个jar是否已经存在。

如果存在这个jar, 那看看你spring mvc的配置是怎样的, 你具体是要扫描哪些注解类?

我在使用spring过程中, 很多带注解的类也都是在依赖jar中, 只要路径配置正确,不存在扫描不到的情况。

项目A是web项目,项目b是jar,项目A引用了项目b,在myeclipse中 运行项目A,没问题。
现在将项目A 打包成war,将war放在tomcat中,启动tomcat,报错。jar中所有的service都没扫描到。

首先A,b两个项目是否同为一个项目的不同模块, 我估计你的不是, 那么在ide里面你如果修改了b中的代码,比如加了注解,加了类,直接启动是能即使生效的。  但是打包的时候,如果不是具有相同的父项目,则新代码需要重新打包安装的本地maven中, 也就是你要先把b项目install到本地, 然后再打包A,这是的war才具有最新的代码。

不晓得你明白我的意思没, 你尝试用反编译工具看下你当前war下面的jar是否是最新的代码

我明白你的意思,打包后的war中包含最新的代码,我两个项目拥有同一个父项目的。 

引用 15 楼 liubingjunws 的回复:
Quote: 引用 14 楼 whos2002110 的回复:
Quote: 引用 13 楼 liubingjunws 的回复:
Quote: 引用 5 楼 whos2002110 的回复:

你是怎么测试的? 如果是web环境中,先去tomcat中项目的lib下面确认这个jar是否已经存在。

如果存在这个jar, 那看看你spring mvc的配置是怎样的, 你具体是要扫描哪些注解类?

我在使用spring过程中, 很多带注解的类也都是在依赖jar中, 只要路径配置正确,不存在扫描不到的情况。

项目A是web项目,项目b是jar,项目A引用了项目b,在myeclipse中 运行项目A,没问题。
现在将项目A 打包成war,将war放在tomcat中,启动tomcat,报错。jar中所有的service都没扫描到。

首先A,b两个项目是否同为一个项目的不同模块, 我估计你的不是, 那么在ide里面你如果修改了b中的代码,比如加了注解,加了类,直接启动是能即使生效的。  但是打包的时候,如果不是具有相同的父项目,则新代码需要重新打包安装的本地maven中, 也就是你要先把b项目install到本地, 然后再打包A,这是的war才具有最新的代码。

不晓得你明白我的意思没, 你尝试用反编译工具看下你当前war下面的jar是否是最新的代码

我明白你的意思,打包后的war中包含最新的代码,我两个项目拥有同一个父项目的。 

好吧, 这样你在eclipse里面能正确运行,那配置是没问题的了, 我想不到有什么其它原因了, 要不你换个tomcat试下?

还是谢谢你了。whos2002110 我还不知道怎么单独给你分
是不是你的maven下面的jdk和开发环境下来的jdk不一致啊
jar的mainfest.mf里的信息是什么样的?是否包含了路径和class文件?
感觉路径环境的问题。
引用 19 楼 fangmingshijie 的回复:

jar的mainfest.mf里的信息是什么样的?是否包含了路径和class文件?

版主大大,说实话,我没看懂你的意思

Manifest-Version: 1.0
Built-By: Administrator
Build-Jdk: 1.7.0_09
Created-By: Apache Maven 3.2.1
Archiver-Version: Plexus Archiver
这个jar包里的内容
昨晚郁闷了一晚上,今晚继续搞
真的假的啊。我试试
还有大神在嘛
引用 19 楼 fangmingshijie 的回复:

jar的mainfest.mf里的信息是什么样的?是否包含了路径和class文件?

明白你意思了。下面是mainfest.mf的内容,如图所示,包含了路径和类


100分
<context:annotation-config/>去掉
<context:component-scan base-package=”*”/>改为<context:component-scan base-package=”com.*”/>
引用 27 楼 fangmingshijie 的回复:

<context:annotation-config/>去掉
<context:component-scan base-package=”*”/>改为<context:component-scan base-package=”com.*”/>

非常感谢,是这句话问题:<context:component-scan base-package=”*”/>改为<context:component-scan base-package=”com.*”/>

结贴。

所以问你mainfest.mf的信息,如果这里都没有包信息,那下面的话就不说了。
总结:
问题:项目是springMVC+maven 架构。其中某子项目是jar,在项目里运行没问题,打包成war后,springMVC扫描不到jar中的注解 类。
解决过程,从网山查资料,各解决方法如下
1、就是在用eclipse export jar的时候,勾选add directory entries
      我用的是myeclipse,而且不能每次install后 都这么导出,一是环境不同,二是麻烦;
2、使用maven版本:3.0.4, 3.0.5 ,3.2.0, 3.2.1 打包后,jar tf 查看install后的jar,发现带有路径和类信息。3.0.4以下的版本未进行    测试
3、 配置deployment assembly 
4、jdk 什么的版本确保一致
其他的比较杂乱了。郁闷2天的问题,至此结束,再次谢谢版主fangmingshijie和各位大神。同时再问下版主,为什么写*扫描不到? 看了下书,没说明白..

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明spring3 mvc使用注解方式时,不能扫描jar包里面的类