maven依赖导入失败

1. 首先,一般安装好maven后,网上都会有教程将maven镜像站换为aliyun的镜像站,具体是在setting.xml文件的mirrors节点中添加如下配置:

<mirror>    
    <id>nexus-aliyun</id>    
    <mirrorOf>*</mirrorOf>    
    <name>Nexus aliyun</name>    
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>    
</mirror>

 

2. 有的时候,依赖虽然下载失败了,但是相关文件夹中却多了以 .lastUpdated为后缀的文件,此时,如果开发者在开发工具中反复导入,会发现始终无法导入成功,这个时候就需要删除本地仓库中相关的 .lastUpdated文件,可以通过文件搜索找到本地仓库中所有的以 .lastUpdated为后缀的文件,找到后全部删除,再在开发工具中重新导入依赖。

 

maven install 和 maven package 的区别

 在idea项目的maven窗口中可以快速执行命令

他们的具体区别也很简单:

如果service项目依赖dao项目,而dao打了包(package),jar仅仅时打到了dao项目的target下。

这时编译service项目,还是会报错,报错如下,找不到所依赖的dao项目,说明service项目在本地仓库是没有找到它所依赖的dao项目。

然后把dao项目install,本地仓库里有jar了,然后再打包package这个service项目,就不报错了。

 

idea编译的时候报错 java: 找不到符号

假设有两个微服务模块,分别叫A和B,A是你需要发布的项目,但是A里面引入了B。所以在A的项目资源中可以看到B.jar。当在B中新增了一些方法或者属性供A直接调用的时候,在本地测试或许好使。但是打包的时候会报错 java:找不到符号。而这个错误指向你那个新增的方法或属性。这是因为打包的时候,A引入的B.jar还是本地仓库里那个之前的B.jar,所以把B重新install一下,更新本地的B.jar到最新版。之后再打包。问题就消失了。

 

模块间的方法调用问题

例如module1模块要调用module2模块中的工具类。那么就在module1的pom文件中,引入module2即可。

  • module1的pom.xml
<dependency>
    <groupId> module2 的 groupId </groupId>
    <artifactId> module2 的 artifactId </artifactId>
    <version> module2 的 version </version>
</dependency>

 

  • module2的pom.xml
<groupId> module2 的 groupId </groupId>
<artifactId> module2 的 artifactId </artifactId>
<version> module2 的 version </version>
<name>module2</name>

 

 

查看某个类属于哪个依赖

我用的开发工具是Idea,由于原项目中所有类已经引入好了,所以直接按住Ctrl键鼠标左键单击就会跳转到class中,然后再定位到这个class。

如图所示,引入一个依赖需要的信息都展示出来了。下面就是在需要该依赖的模块的 pom 文件中直接引入就可以了。

 

通过 feign 远程调用三方项目的接口

下图是微服务A的接口

我在另一个微服务B中想要调用这个接口:

前提:这两个项目都在注册中心之中已经相关的Feign依赖已经引入并配置完毕,在启动类上加@EnableFeignClients注解

1. 首先在B中声明一个接口,并添加注解@FeignClient,value值指向微服务A在注册中心中的服务名。requestMapping的请求类型和路径要和微服务A中的接口定义的一样。

2.在需要调用的类中注入,并直接调用其方法即可使用。

 

springboot多模块包扫描问题

SpringBoot 启动类上,配置扫描包路径有三种方式:

@SpringBootApplication(scanBasePackages ={"a","b"})
@ComponentScan(basePackages = {"a","b","c"})
@MapperScan({"XXX"})
public class XXApplication extends SpringBootServletInitializer{
}

 

SpringBootApplication注解

这是 SpringBoot 的注解,本质是三个 Spring 注解的和:

  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

它默认扫描启动类所在包及其所有子包, 但是不包括第三方的 jar 包的其他目录 ,通过 scanBasePackages 属性可以重新设置扫描包路径。

注意:如果我们需要扫描依赖 jar 包中的注解,而依赖包的路径跟不包含在 SpringBoot 启动类路径中的话,我们就要单独使用 @ComponentScan 注解扫描第三方包。同时必须指定本工程的扫描路径, 因为一旦有这个注解后,它优先,默认扫描包就失效了 。

SpringBoot 启动类的工程目录为 cn.com.a.b ,引用的第三方公共包 xxx.common.jar 的目录也是 cn.com.a.b ,那么第三方 jar 包中的注解天然能直接被扫描到。

 

ComponentScan注解

这个是 Spring 框架的注解,它用来指定组件扫描路径,如果用这个注解,它的值必须包含整个工程中全部需要扫描的路径。因为它会覆盖 SpringBootApplication 的默认扫描路径,导致其失效。

如果 ComponentScan 指定多个具体子目录,此时 SpringBootApplication 会失效,Spring 只会扫描 ComponentScan 指定目录下的注解。如果恰好有目录外的 Controller 类,很遗憾,这些控制器将无法访问。

回到开头那段代码:

@SpringBootApplication(scanBasePackages ={})
@ComponentScan(basePackages = {})

这里指定了 ComponentScan 注解后, scanBasePackages 就失效了。因此,如果 ComponentScan 的 basePackages 值不包括 cn.com.a.b 即启动类所在的包,仅指定了第三方 jar 的目录,那么 这个工程下任何的注解都无法被扫描到 。

所以,如果加了ComponentScan注解之后,如果SpringBoot 启动类的工程目录为 com.qm.business.admin,需要额外扫描的jar包的路径为com.qm.business.logmanager,那么完整的注解应该为:

@ComponentScan(basePackages ={"com.qm.business.admin", "com.qm.business.logmanager"})

 

MapperScan 注解

这个是 MyBatis 的注解,会将指定目录下所有 DAO 类封装成 MyBatis 的 BaseMapper 类,然后注入 Spring 容器中, 不需要额外的注解 ,就可以完成注入。

 

 

springboot聚合工程引用其他模块jar包打包时报:程序包xxx不存在解决办法

springboot聚合工程要打包工程引用其他模块的jar包打包时报程序包找不到,原因是springboot工程打包编译时,会生成两种jar包,一种是普通的jar包,另一种时可执行jar包,默认情况下两个jar的名称相同,因此在不做额外配置的情况下,普通的jar先生成,可执行jar后生成,这种情况下可执行jar会覆盖普通jar,而我们要引用的就是普通jar,所以打包时会报错。

修改引用的jar包模块的pom文件中的bulid配置,原配置:

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-maven-plugin</artifactId>  
        </plugin>  
    </plugins>  
</build>

修改后的配置:

<build>  
    <plugins>  
        <plugin>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-maven-plugin</artifactId>  
            <configuration>  
                <classifier>exec</classifier>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  

 

posted on 2020-12-18 16:04  FuYingju  阅读(939)  评论(0编辑  收藏  举报