springboot,自己的start怎么访问调用者的resource?

springboot项目,我有一个基础服务baseA,然后想把baseA做成一个启动器start,这样自动配置注入,可以最大程度的减少调用者的代码书写,直接引入baseA就可以了.
baseA的作用,就是拿来加载调用者项目下的license文件,帮他做鉴权的.但是现在我把baseA提供给实际的项目projectB调用.发现文件获取报错.
我baseA里面写的是new ClassPathResource(path)的方式.能够获取baseA自己的resource下的资源.
但是放到projectB上使用时,就会报

cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:baseA.jar!/license.lic

找不到资源.看打印,他访问的是已经打成jar包的baseA.jar下面的自己的license文件.
但我想让他访问的是调用者的resource资源,怎么修改baseA代码?虚心求教,还请大神不吝赐教.

如果A的内部逻辑依赖B的配置文件,那为什么不把文件直接放在A里面呢?

想要免代码直接执行肯定是不行的

如果你需要用B里面的licence文件,去注册,然后才能实现A里面的功能,那建议你在A里面暴露一个端点,B需要先用licence文件用这个端点去注册,然后A获取到这个licence后,校验通过后给到一个标记位,后续的功能通过这个标记位去判断权限,是否能使用某些功能

上述的这个注册过程,必须是B主动去注册的,而没办法用A主动拉取B的文件

双亲委派模型看起来还没吃透啊

你可以看一下源码,当你没有指定classLoader的时候,会指定一个默认的classLoader,最终也是通过classLoader的getSystemResourceAsStream来读取的

很明显是由于你的文件属于jar包下面,是无法读取jar包外部的licence文件的,jar包内部的classLoader怎么能越级读取jar包外部的文件呢?

如果你希望使用jar包外面的文件,建议通过BaseB读取文件,然后再交给BaseA的形式取执行,而不是直接用BaseA取读BaseB的文件

啊,我是个初级码农,双亲刚百度才知道,那受累问下,如果我让B读取文件交给A,那这样,还能做到免代码书写么?

我想做的是,无论谁引入BaseA,都只需要去pom文件写好坐标,啥也然后调用者啥也不用干,直接启动项目就会自动验证调用者resource下面的授权文件是否合法.

你说的,调用者B去读自己的文件,再交给A,那是不是所有调用者都需要再去写一段代码,然后主动调用BaseA的验证程序?

首先,你要用A去调用B下面的文件,肯定是不支持的,必须用B去调用A的形式,这个是出于安全性考虑的

如果你只需要pom文件的继承,可以用pom文件的<parent>标签实现,具体你可以去百度一下

好的,感谢解答.

您好,如何方便,再跟您请教下.我的parent标签已经用了.

所有项目都是springboot项目,他们都要继承自springboot的starter啊.

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.4.1</version>
	<relativePath/>
</parent>

下面是我自己的实际项目,想要的效果是:项目引入mbb-start-baseA.然后啥也不干,在启动项目时.baseA会读取项目根目录的license文件并检查.我还是没想到,项目怎么读取自己,并交给baseA...十分抱歉打扰,还请不吝赐教...感谢感谢.


<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
        
<dependency>
	<groupId>myself</groupId>
	<artifactId>mmb-start-baseA</artifactId>
</dependency>

实现方法比较多,但是必须通过B去调用A的形式去做

可以在B里面写一个@PostConstruct,启动时候执行,B用流读取文件,这时候文件在内存中,你可以写单例缓存这个文件,然后调用A的方法去做业务

好,懂了.谢谢啊

你这个start是单独可以启动的服务,还是只是个jar?

如果是服务,那只能提供接口了;

如果只是个jar,spring采用PathMatchingResourcePatternResolver,可以读取classpath和classpath*下面的文件;

classpath*基本就为所欲为了

额,不是单独启用的.是个像mybatis一样的服务.

别人直接通过maven引入的方式,把我的start引入.

然后启动自己的项目.我的start会去加载他项目resource下面的license文件,然后解密文件,判断license文件是否合法.

如果不合法,则无法启动项目.

这个start就是一个授权系统.

领导让我做,但是我不想和项目写到一起,这样每次做个项目,都要写一套授权逻辑,太麻烦了.我想做成一个公用的授权模块.

这样别的开发部也可以拿去用.我想做成傻瓜式的.就像我描述的那样.

他们只需要maven引入start.把授权文件放在自己根目录下启动就行了.不想让他们再书写代码.如果还要人工写.感觉不够智能.

可现在就卡在,我的start被他们拿去引用的时候.start读不到他们项目resource下面的文件...

我查了你说的那些知识点,还是没找到方案...

他们拿去在IDEA里面启动是没问题的.但是当他们把他们的项目打成jar包部署运行的时候,就报错了.打印的错误日志就是前面发的那个,好像start读取文件的程序,没有去调用者resource下面找,而是就直接在start自己的jar包下找的...我不知道我描述的有没有清楚,十分感谢你的热心能帮我.谢谢啊.