问题:自己下载的maven引入到IDEA项目中,出现如下错误,求解决? For artifact {null:null:null:jar}: The groupId cannot be empty. https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241012/5e7535697e2baf2b3a2397e1f24b54cb.png https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241012/377145df0cc21dacd609371169142afc.png https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241012/a3fbc71aadc5dbc33097cb0bcaa3bbd4.png 成功引入
假设现在有两个服务A和B, 他们使用的数据库不同。正常情况下,服务A想调用服务B的方法,就需要服务B暴露出一个接口,然后A服务通过远程调用的方式调用 以下是A服务的接口示例 @RestController public class AServer { @Autowired LanguageMapper languageMapper; @Autowired Student student; @PostMapping(value = "/language1") public List a() { List list = languageMapper.selectList(new QueryWrapper().eq("id", "301")); System.out.println(list); return list; } @PostMapping(value = "/language2") public String test2() { return student.getName() + "is a good boy"; } } @Configuration public class GenerateStudent { @Value("${123}") String age; @Bean public Student ges() { Student lm = new Student("李明"); lm.age = age; return lm; } } 以下是B服务的接口示例 @RestController public class BServer { @Autowired AServer aServer; @PostMapping(value = "/language1") public List test() { List list = HttpsUtils.httppost("http://localhost:8011/unique/language/language1"); System.out.println(list); return list; } } 调用方式如下图所有 https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/801df528719df840f7f7055e0113b879.png 但这个方式需要B服务先启动,并且查询到的数据是数据库B的数据。 那么如果将服务B的坐标添加到服务A的pom文件里,然后在A服务中使用Autowired注入B服务的接口B的bean对象,然后用b.method()调用, 修改B服务接口的代码如下 @RestController public class BServer { @Autowired AServer aServer; @PostMapping(value = "/language1") public List test() { List list = aServer.a(); System.out.println(list); return list; } } https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/05baa84d520cd05bfce0b862f11181e4.png 有以下疑问: 1. 这个时候不启动B,只启动A,能正常启动A吗 答案:有以下特殊情况,若无的话即可正常启动A (1)bean冲突错误。如果A服务和B服务定义了两个相同的类名,并且都交给了Spring管理,那在启动时Spring会生成bean放到容器里,由于Spring创建bean的规则默认是类名首字母小写,所以它会识别到两个相同的bean,导致无法生成而报conflict bean错误。 解决方法:生成bean时指定bean名称,尽量避开生成相同的bean (2)无法找到变量 - Could not resolve placeholder; 在B服务中,生成了一个自定义的bean对象Student, 该bean对象需要从配置文件里实时读取配置赋值。如果 A服务中没有这个配置名称,则会报Could not resolve placeholder。 (3)ambiguous mapping. 如果A服务和B服务在对外暴露接口时,使用了相同的mapping路径,则会报这个错。 2. 这个时候B也会启动吗? 答案:不会,但也有一种特殊情况,即在A里注入了B服务的启动类对象,然后显式调用了其main方法。 3. 若启动成功了,这个A时候调用了B的方法,查的是A服务配置的数据库信息,还是B服务配置的数据库信息。 答案:由第一点可知,首先确保A服务里有B服务所需要的所有配置信息,如数据库配置,否则无法启动。启动后,通过依赖方式注入对象调用,实际上调用的是A服务使用的数据库。如果写的SQL的表名在数据库中不存在,就会报SQL Exception。 由以上3点推测,实际引入Jar包,并且注入对象,只是用了相应的壳子,里面的数据都来自于引入A服务的配置。但是作为resources目录下的东西,B服务配置文件application.properties没有生效,而mapper下的各个sql又生效了(一开始我还以为第3点会报SQL Bind Exceptioon)。这点要注意。 因此我们若要提供一个jar包服务作为公共调用,包括开发中,应尽量满足以下原则: 1. 该jar包只用于提供公共方法,如hutuTool等。 2. 若有用到配置项,应在@value注解里给个默认值,防止被引用的服务无法启动。目前在手册中尽量写明需要用哪些配置项。 3. jar包只是一个壳子,他只是一系列方法的聚合,目的是为了防止重复造轮子,但这个轮子是什么数据,还是由被引用的服务提供。这也是引入jar包后注入对象调用这个方式 和 远程调用方式最显著的区别。一个是查自己的数据,一个是查别的数据。(终于解开了我多年的疑惑) 4. jar包最好不要向外提供服务(为了防止mapping重复),也不要生成bean(为了防止bean重复,但这个好像很难做到,可以用接口+多态替代).应当只提供运算等。 由以上两点可知:通常能被当做jar包作为依赖的服务,
前端初次使用VS Code开发Java程序,编辑器似乎无法把本地私有包和项目关联起来 "VS Code报错" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240924/549d54be79390c2557219a11a7d294a0.png) 从图片中可以看到,这些内网私有包实际是已经安装了,但是似乎没有跟项目关联起来,有大神帮忙看看吗? "本地repo" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240924/e261ccc7c7813d73085bc230c961040b.png) 以下是vscode中相关的配置 "maven.settingsFile": "D:\\Develop\\settings-dc.xml", "maven.executable.path": "C:\\Program Files (x86)\\apache-maven-3.9.7\\bin\\mvn.cmd", "java.configuration.maven.userSettings": "D:\\Develop\\setting-dc.xml", 这些是我本地的maven设置文件(直接从同事手里搬来的,删了注释) D:\Develop\repository com.spotify Nexus-dcxx *,!private-release,!private-snapshot Nexus http://内网地址/repository/maven-public/ private-repo private-release Repository for Release artifacts http://内网地址/repository/private-release/ default true daily warn false never warn private-snapshot Repository for Snapshot artifacts http://内网地址/repository/private-snapshot/ default false always warn true never warn private-repo
我在java项目中使用maven管理依赖。其中借助依赖工具查看,commons-codec的版本是1.16.0。 最终构建出来的jar包中也是1.16.0版本。 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240919/c2ea161d8359a762724cecb360ca81f7.png) 但是我通过idea自带的依赖分析工具查看,commons-codec有两个来源,根据颜色,1.16.0版本应该是是在poi中指定的 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240919/2dc580bd81f0f49cad78f5aea0f368d4.png) 但是poi-4.1.2中指定的却是1.13版本 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240919/916b9e404db9712f88a2a65f93944ada.png) 我又查看了httpclient中的配置,是1.9版本的commons-codec。这里是因为httpclient是继承自httpcomponents-client,httpcomponents-client中配置了1.9 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240919/759764f7ec1aaf1f784e1191161cd342.png) 所以我想知道为什么最终是1.16版本的commons-codec
为什么使用idea创建父子工程选择maven创建的时候有父项,而使用Springboot创建父子工程的时候pom里面就没有父子依赖关系呢?必须要手动指定?
新建maven父子工程,然后新建子模块A和子模块B,在A模块随便写几个带有system.out.println函数代码,配置子模块B依赖子模块A,子模块B内调用子模块A的输出测试内容的函数。对子模块B进行clean package,如果不对父工程执行install,对子模块B进行clean package就会出现这个以下错误。 Could not resolve dependencies for project com.test:module-b:jar:1.0.1: The following artifacts could not be resolved: com.test.module-a:jar:1.0.1: Could not find artifact com.test:module-a:jar:1.0.1 in alimaven (http://maven.aliyun.com/nexus/content/repositories/central/) 由于com.test.module-a没有安装到本地仓库,然后不知道为什么maven去阿里云的maven仓库去找了,但com.test.module-a是同属父模块下的子模块。 为什么对子模块进行clean package,打包过程中对父子工程的模块之间引用依赖的访问加载一定要经过本地仓库或者其他远程仓库? 所以子模块B依赖子模块A。对子模块B进行clean package,子模块B依赖子模块A在关联上没有install到本地仓库中。这个情况下如何对子模块B打包成功? 验证成功条件: 把maven父子工程复制一份项目副本,把副本项目中的子模块A中带有system.out.println的函数代码中修改输出内容,然后对副本的子模块B执行clean package在部署运行,看看副本和原来的在部署输出的测试内容上是不是不一样的。 父模块: 4.0.0 com.test test_box1 1.0.1 pom module-a module-b 17 17 UTF-8 com.test module-a 1.0.1 子模块A: 4.0.0 com.test test_box1 1.0.1 ../pom.xml module-a 17 17 UTF-8 子模块B: 4.0.0 com.test test_box1 1.0.1 ../pom.xml module-b jar 17 com.test module-a module_b org.apache.maven.plugins maven-compiler-plugin 3.8.1 17 17 UTF-8 org.apache.maven.plugins maven-shade-plugin 3.2.1 package shade demo start.AppStart1
刚开始学后端,有几个问题想要请教下大家 1 是使用maven,还是IDEA的提供的intellij?不使用另一个的原因是? 2 如果是使用maven的话,是使用IDEA自带的maven,还是自己额外下载?看的一些网上教程都是让自己单独下载maven,说IDEA自带的maven不方便配置。 谢谢
有如下 Maven 插件代码: @Mojo(name = "generate") public class GenerateMojo extends AbstractMojo { @Parameter(defaultValue = "${project.build.outputDirectory}", required = true) private File outputDirectory; @Parameter private File outputFile; @Override public void execute() throws MojoExecutionException, MojoFailureException { Set permissionCodeSet = new HashSet(); URL url; try { url = outputDirectory.toURI().toURL(); } catch (MalformedURLException e) { throw new RuntimeException(e); } getLog().info(url.toString()); Reflections reflections = new Reflections( new ConfigurationBuilder() .addUrls(url) .setScanners(MethodsAnnotated)); reflections.getStore().forEach((s, stringSetMap) -> { stringSetMap.forEach((k, v) -> { System.out.println(k); v.forEach(System.out::println); System.out.println(); }); }); Set resources = reflections.get(MethodsAnnotated.with(GetMapping.class).as(Method.class)); System.out.println("resources = " + resources); Set methodSet = reflections.get(MethodsAnnotated.with(SaCheckPermission.class).as(Method.class)); getLog().info(methodSet.toString()); methodSet.forEach(method -> { SaCheckPermission saCheckPermission = method.getAnnotation(SaCheckPermission.class); List values = List.of(saCheckPermission.value()); permissionCodeSet.addAll(values); }); getLog().info(permissionCodeSet.toString()); } } Reflections 能够正确实例化并扫描成功,日志如下: [INFO] Reflections took 67 ms to scan 1 urls, producing 7 keys and 79 values 尝试打印 store 内容也正确,但 methodSet 和 permissionCodeSet 均为空 尝试在使用插件的项目中运行上述代码,能够正常输出内容。
项目的结构如下 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/79fd39e04bc1328b450ef366ea9d3807.png) 问题是:雇主要求要升级spring-core的版本 ,我这里想着是把spring-boot-starter-parent版本升级 我的操作是:在A项目中在中加入 org.springframework.boot spring-boot-starter-parent 2.6.6 import pom 结果是:springboot的各种starter的版本没有变,springframework的版本变成了我想要的,这样会导致boot的版本和spring的版本不匹配 我想要的结果是:springboot和spring的版本一起变 ,父工程B不动(不知道是哪个项目组负责的)
Maven "3.3.1" (https://link.segmentfault.com/?enc=IV0sU41OHF0gNm7djH8BZA%3D%3D.sjcc0oT45NqGxWDmV3cO46LWWRE3UKTOswq419MXDvj4bXTlRXhcc1cenyV%2F2wPlvqWg5RsJmd4u%2Bcfzn4yigg%3D%3D)新增一个特性 可以使用@后缀指定id。 我的pom.xml文件的部分代码如下: cds.build cds deploy --to h2 --dry > "${project.basedir}/src/main/resources/schema-h2.sql" schema.sql cds deploy --to postgres --dry > srv/src/main/resources/schema.sql 有两个相同的goal但是对应执行的命令参数不一样,我执行了 "mvn cds:cds@schema.sql" 但是没有按照预期执行 schema.sql中的命令 PS D:\VSCode\CAPTEST\TEST\bookshop\srv> mvn cds:cds@schema.sql [INFO] Scanning for projects... [INFO] [INFO] --------------------------------------------------- [INFO] Building bookshop 1.0.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- cds:2.4.1:cds (schema.sql) @ bookshop --- [INFO] CdsMojo: Identified D:\VSCode\CAPTEST\TEST\bookshop as reactor base directory. [INFO] CdsMojo: Using directory containing a .cdsrc.json as working directory: D:\VSCode\CAPTEST\TEST\bookshop [INFO] CdsMojo: Searching npx.cmd on local file-system. [INFO] CdsMojo: Found D:\Program Files\nodejs\npx.cmd [INFO] CdsMojo: Executing [D:\Program Files\nodejs\npx.cmd, -c, cds version] in working directory D:\VSCode\CAPTEST\TEST\bookshop [INFO] CdsMojo: Using configured working directory: D:\VSCode\CAPTEST\TEST\bookshop [INFO] CdsMojo: Executing [D:\Program Files\nodejs\npx.cmd, -c, cds deploy --to h2 --dry > \"D:\VSCode\CAPTEST\TEST\bookshop\srv/src/main/resources/schema-h2.sql\"] in working directory D:\VSCode\CAPTEST\TEST\bookshop [INFO] CdsMojo: [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 22.225 s [INFO] Finished at: 2024-01-09T15:58:16+08:00 [INFO] ------------------------------------------------------------------------ 从日志中来看maven识别到了我的参数@schema.sql "[INFO] --- cds:2.4.1:cds (schema.sql) @ bookshop ---" 但最终执行的命令还是第一个execution中的命令,这是因为什么?因为我对maven并不是很了解,会有哪些配置影响到命令行的执行 我调换过这两个execution的位置,发现实际执行的是第一个execution中的命令,也就是说命令行中指定execution-id并没有实际生效。