概述
A作為被引用的項目,目錄結構如下:

可以看到A目錄中只有基礎的service類以及mybatis操作數據庫的相關文件,service類中包含查詢數據庫的方法。
Tips: 項目A也可以是一個包含啟動類和配置文件的Springboot項目,一般情況下只會將公共的方法和類提取打包成公共jar供其他項目引用,而且這里啟動類的配置對后續引用也會造成影響,不利於排查。所以不推薦使用,盡量刪除在被引用的項目無用的配置文件和test文件,在主項目中進行必要的配置。
A項目作為公共項目打成jar供其他項目引用,注意被引入的項目不能使用默認的maven-plugin打包,否則引入此jar包的項目編譯時會報找不到程序包的錯誤
需要替換成以下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
配置完成后使用maven工具進行打包

成功之后可以看到本地maven倉庫中會出現上圖左邊標記出的jar,其他項目引用時,只需要在pom文件中使用上面的坐標引入依賴。
C項目引用A項目,目錄結構如下:

項目C作為主程序,需要有啟動類和配置文件,下面詳細說明一下啟動類的配置。
C項目本身只需要配置掃描當前項目的dao接口。因為@SpirngBootApplication默認包含了@ComponentScan注解並且處於其他類文件的根目錄,所以可以自動掃描到同級下面的所有@Service、@Controller類。

如果要掃描到A項目的類和接口就要添加A的目錄,寫法如下:

@MapperScan同時掃描A的dao接口和C項目的dao接口
@ComponentScan同時注冊A和C項目下需要被使用的類
這里如果MapperScan只掃描了C項目,那調用A的dao接口中的方法時,會初始化失敗項目無法啟動,
如果ComponentScan只掃描了A項目,那么訪問C項目的Controller會報404錯誤。
Tips:如果被引入的jar和主項目兩個項目的文件路徑全都一致的話,就不需要額外再配置掃描被引入的項目的目錄。
配置文件application.yml:
server:
port: 8082
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://**.**.**.***:3306/database?usessl = false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
username: username
password: password
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 5
maximum-pool-size: 15
auto-commit: true
idle-timeout: 30000
pool-name: DatebookHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
mybatis:
configuration:
mapUnderscoreToCamelCase: true
call-setters-on-nulls: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*:mapper/*.xml
這里對服務的端口、數據庫連接、mybatis進行了配置。
注意:如果引入的其它的jar並且要使用它對應的mapper/*.xml文件時,要修改mapper-locations配置,使用通配符掃描所有calsspath對應目錄下的mapper文件
mapper-locations: classpath*:mapper/*.xml
測試:CccController.java
/**
* @ClassName CController
* @Description 測試調用其他jar中的方法
* @Author Sue
* @Create 2020/1/15 9:39
**/
@RestController
@RequestMapping("/ccc")
public class CcController {
@Autowired
private CcService ccService;
@Autowired
private AbcService abcService;
@Autowired
private AbcMapper abcMapper;
@GetMapping("/test01")
public Map<String, Object> test01() {
Map<String, Object> res = new HashMap<>();
res.put("code", 200);
//C項目service方法
res.put("c_service", ccService.queryOne());
//A項目的dao和service中的方法
res.put("abc_mapper", abcMapper.queryOne());
res.put("abc_service", abcService.queryOne());
return res;
}
}
我們在C項目的Controller中調用了C項目的查詢數據的方法和A項目查詢數據庫的方法,訪問接口成功返回數據,說明我們成功的在C項目中引用A項目並調用了其操作數據庫的方法。
{"code":200,"c_service":9419,"abc_service":9419,"abc_mapper":9419}
EOF
