Jar动态编译找不到包的解决方案

Jar动态编译找不到包的解决方案

最近写程序遇到需要动态编译代码的需求,主要思路是扫描、生成代码、编译成class、生成实例,注入静态容器里。
扫描、生成代码、编译成class、生成实例、注入容器都是Java基础,这里没有多少讲解的必要。主要是项目打包以后,部署到正式环境时,遇到了无法动态编译的问题。


问题描述

项目默认使用spring-boot-maven-plugin来打包,打包出来的jar包使用java -jar来运行,无法找到符号,截图
在这里插入图片描述


排查思路:

1.我们首先怀疑相关依赖是否导入到jar包,我们解压jar文件,在BOOT-INF\lib里面发现需要的jar已存在
2.既然jar已存在,我们需要怀疑导入的jar与开发的jar是否一致,因为开发时用到了另一个项目生成的jar,可能本地仓库的jar与实际开发的jar不一致。将依赖的jar重新编译,重新编译项目,发现故障依然没有解决。
3.使用源码启动程序,一切正常,打包后启动,无法启动。在IDE中启动与jar包启动的区别是classpath存在不同,因此我们知道需要解决classpath问题。


解决方案:

网上有解决方案,将jar扫描一遍,获取流来获取目标class然后调用compiler,但是这存在很强的侵入性,不优先考虑。

我们去掉spring-boot-maven-plugin来编译程序,去除依赖项,获得本项目的jar包,再将使用spring-boot-maven-plugin打包后的jar包中的BOOT-INF\lib里面的jar包导入到相同路径·,对源码jar包与依赖jar包进行打包,添加主程序清单,运行,发现可行。

其他:

Maven打jar包时设置入口:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.main.Application</mainClass> <!-- 此处为主入口-->
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring中,使用@Autowired注解来自动装配Bean,可以将一个Bean注入到另一个Bean中。但是,如果想要注入的Bean在一个jar包中,而不是在当前项目中,就需要注意一些问题。以下是几种可能的解决方案: 1. 确认jar包已被正确引用 首先需要确认你所使用的jar包已经被正确引用。可以在你的项目中查看是否已经将该jar包添加到依赖中。如果没有添加成功,可以尝试手动将该jar包添加到项目中。 2. 确认类的路径是否正确 如果jar包已被正确引用,但是加载不到某个类,那么可能是因为类的路径不正确。可以通过反编译jar包中的class文件或者查看jar包中的文档来确定类的完整路径。 3. 使用@ComponentScan注解 在Spring Boot中,可以使用@ComponentScan注解扫描指定的,以便自动装配Bean。可以在主类上添加@ComponentScan注解,并指定要扫描的路径,例如: ``` @SpringBootApplication @ComponentScan(basePackages = {"com.example.package1", "com.example.package2"}) public class MyApplication { ... } ``` 这样就可以扫描指定的,自动装配Bean。 4. 使用@Import注解 另一种解决方案是使用@Import注解,将jar包中的配置类导入到当前项目中。可以在主类上添加@Import注解,并指定要导入的jar包中的配置类,例如: ``` @SpringBootApplication @Import(com.example.mypackage.MyConfig.class) public class MyApplication { ... } ``` 这样就可以将jar包中的配置类导入到当前项目中,自动装配Bean。 总之,如果无法加载jar包中的类,请先确认jar包已被正确引用,并检查类的完整路径是否正确。如果仍然无法加载类,可以尝试使用@ComponentScan或@Import注解来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值