java打完jar包后class文件如何搜索

一。背景:一直困惑,java项目打完jar包后,是如何指定class文件加载的?

1.java虚拟机默认会从classpath中搜索class文件。 有关博客的解释:

  默认java虚拟机要从classpath环境变量的路径中搜索class文件去执行,对于java虚拟机来说,这不是类文件,而是类。它只有类路径,而没有文件系统路径。而classpath环境变量正是为java虚拟机提供搜索类路径的环境。注意,虚拟机不会递归搜索classpath定义的路径。

2. java中默认搜索:

在java虚拟机搜索类文件时,除了classpath环境变量指定的路径,还会先搜索两个默认的路径:jre/lib和jre/lib/ext下的jar文件中似乎否有待搜索的类。

3. jar -cv -f  xx.jar  -m manifest.mf  com/  打包属性时指定清单文件

Class-Path属性中包含了用空格分隔的jar文件,在这些jar文件名中要对特定的字符使用逃逸符,比如空格,要表示成" ",在路径的表示中,都采用“/” 来分隔目录,无论是在什么操作系统中,(即使在window中),而且这里用的是相对路径(相对于本身的JAR文件) 

4. 有关配置文件在项目中的放置位置

  jar包内有些配置文件想放在jar包外面,比如文件config.properties:如果这个文件是以路径方式载入的,比如new file("./config/config.properties"),那么将config.properties放在jar包相同目录下的config目录下即可,也就是说“./”路径等价于jar包所在目录;如果这个文件是以ClassPath下的文件这种方式载入的,比如在Spring中载入classpath:config.properties,则在MF文件的配置文件的ClassPath中添加“./”,然后将这个配置文件与jar包放在同一个目录即可,当然也可以在MF文件的配置文件的ClassPath中添加“./config/”,然后把配置文件都放在jar包相同目录下的config目录下。

 5.直接运行 MANIFEST.MF 中指定的 main 方法:


       java -jar mplus-service-jar-with-dependencies.jar

6.maven打包把依赖包也打进本项目的jar包里:

mvn assembly:assembly

7. jar包中运行时指定依赖的jar

 -Djava.ext.dirs=./    ext的默认值是JRE/LIB/EXT

 -Djava.library.path:指定非java类包的位置(如:dll,so)

二. jar包中的资源文件加载

1.如果使用classloader方式加载资源则路径前不能加“/”,如果使用class方式加载前面最好加上“/”。

   此时可以看到jar为一个文件,其中的资源文件也是以stream方式获取。

getResourceAsStream:

Test.class.getClassLoader().getResourceAsStream("test.config");
Test.class.getResourceAsStream("/test.config")

 getResource:

Test.class.getClassLoader().getResource("test.config");

Test.class.getResource("/test.config")

说明:在大成jar包后获取返回值会报null。所以一般情况推荐使用stream方式读资

三.对于dll库的引用

  1. 尝试大成jar包后,只有把dll依赖放在和jar同一目录下比较有效,其他方法试着都不好使。正确的位置如下图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你打包 Java 项目为 JAR 文件时,有时候会出现某些 class 文件无法打包进去的情况。这可能是由以下几个原因导致的: 1. 编译问题:确保所有的 Java 源代码都已经成功编译成了 class 文件。在打包之前,建议先进行一次完整的编译,以确保所有的 class 文件都是最新且可用的。 2. 打包配置问题:检查你的打包配置文件(如 Maven 的 pom.xml 文件或 Gradle 的 build.gradle 文件)是否正确配置了需要打包的所有 class 文件。确保没有漏掉任何需要打包的类。 3. 资源文件问题:如果有一些额外的资源文件(如 properties 文件、XML 配置文件等),确保这些文件在打包过程中被正确地包含在 JAR 文件中。可以检查打包配置文件中是否正确指定了这些资源文件的位置。 4. 排除依赖项:有时候,一些依赖项的 class 文件可能会与你的项目中的类冲突,导致无法打包。你可以尝试排除一些冲突的依赖项,或者使用更具体的依赖项版本来解决冲突。 5. 命名冲突:如果你的项目中有多个类具有相同的名称,可能会导致冲突。确保每个类都具有唯一的全限定名,以避免命名冲突。 如果以上方法都无法解决问题,你可以尝试使用命令行方式手动打包 JAR 文件,以便更精确地控制打包过程。你可以参考相关的文档或教程,了解如何在命令行中使用 javac 和 jar 命令来手动打包。 如果问题仍然存在,建议检查具体的错误信息或日志,以获得更具体的帮助和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值