这是错误提示:Duplicate application configs: <dubbo:application name="demo-provider" id="demo-provider" /> and <dubbo:application name="demo-provider" id="demo-provider2" />
最近在eclipse上搭建dubbo+spring+mybatis。provider启动是这样的。用注释段启动没问题,非注释段启动就报这个错了。
public class DemoProviderTest {
// public static void main(String[] args) throws Exception {
// ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
// new String[] {"META-INF/spring/serviceApplicationContext.xml"});
// context.start();
//
// System.out.println("Hello!");
//
// System.in.read(); // press any key to exit
// context.close();
// }
public static void main(String[] args) throws Exception {
com.alibaba.dubbo.container.Main.main(args);
}
}
在日志里有这么一段,相当于加载了两次。
Pre-instantiating singletons in @16eabae: defining beans [com.alibaba.dubbo.config.spring.AnnotationBean,demo-provider,com.alibaba.dubbo.config.ConsumerConfig,com.alibaba.dubbo.config.RegistryConfig,dubbo,org.springframework.context.support.PropertySourcesPlaceholderConfigurer#0,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,com.alibaba.dubbo.config.spring.AnnotationBean2,demo-provider2,com.alibaba.dubbo.config.ConsumerConfig2,com.alibaba.dubbo.config.RegistryConfig2,dubbo2,org.springframework.context.support.PropertySourcesPlaceholderConfigurer#1,dataSource_mysql,sqlSessionFactory,org.mybatis.spring.mapper.
我的pom文件build段是这样的。再次说明,是用dubbo的main方法启动才出现的这个错误。
<build>
<resources>
<resource>
<!-- project开头的变量为maven内置变量
- ${project.build.directory}代表target目录
-->
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<!-- dubbo的main方法启动用到的配置文件最后需要在target/classess/META-INF/spring目录下生成
- 若配置文件已在src/main/resources/META-INF/spring目录下,则可省略targetPath
-->
<resource>
<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>serviceApplicationContext.xml</include>
</includes>
</resource>
</resources>
<!-- 这里是为了在使用maven-dependency-plugin时,预防maven版本不一致导致的环境冲突 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[2.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!-- 将项目所需依赖打包到指定位置target/lib -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<useUniqueVersions>false</useUniqueVersions>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.alibaba.dubbo.container.Main</mainClass>
<useUniqueVersions>false</useUniqueVersions>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<!-- 在Class-Path中增加当前目录 -->
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
原因:dubbo相关的xml资源被 了两次,在这里。
<resource>
<!-- project开头的变量为maven内置变量
- ${project.build.directory}代表target目录
-->
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
然后在serviceApplicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:property-placeholder location="classpath*:*.properties" ignore-unresolvable="true"/>
<context:component-scan base-package="com.sail.demo.dubbomybatis.service"/>
<import resource="classpath:META-INF/spring/dubbo.xml"/>
<import resource="classpath*:dataAccessContext.xml"/>
</beans>
当dubbo的main方法执行时,会去读取jar包中的配置文件,dubbo.xml和serviceApplicationContext.xml分别读取了一遍。
我这里是将serviceApplicationContext.xml里的<import resource="classpath:META-INF/spring/dubbo.xml"/>这段删除,问题解决。