发布java包运行提示找不到配置文件

主要是因为jar包是一个单独的文件而不是文件夹,不能通过路径的方式来找到配置文件。

一个程序,在开发环境运行得好地地,发布成jar包后,一运行就报错,提示找不到配置文件。提示类似这样的错误:
FileNotFoundException: jar:file:/xxx-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/cert/loadFFmpeg.properties

但事实上,包里文件是存在的。究其原因,主要是因为jar包是一个单独的文件而不是文件夹,不能通过“file:***.jar!\BOOT-INF\classes!\loadFFmpeg.properties”这样的方式来定位jar包内的资源。

网上资源提供了修改示例:

原代码

SAXReader xmlReader = new SAXReader();
String path = URLDecoder.decode(this.getClass().getResource("/").getPath(), "UTF-8");
File xmlFile = new File(path + "/jdbcType.xml");
Document document = xmlReader.read(xmlFile);

改为

SAXReader xmlReader = new SAXReader();
InputStream xmlFile = this.getClass().getResourceAsStream("/jdbcType.xml");
Document document = xmlReader.read(xmlFile);

但我这里的方式静态的,没有this,咋改?其实更简单。

我的代码

原代码

    public static <T> T load(String fileName, Class<T> cl) {
        InputStream is = null;
        String path = "";
        try {
           path = ResourceUtils.getURL("classpath:").getPath();
           path = URLDecoder.decode(path, "utf-8");
           path = String.format("%s%s", path, fileName);
           is = new FileInputStream(path);
        } catch (FileNotFoundException e) {
            System.err.println(String.format("找不到配置文件:%s%s", path, fileName));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        if (is != null) {
            Properties pro = new Properties();
            try {
                System.out.println("加载配置文件...");
                pro.load(is);
                System.out.println("加载配置文件完毕");
                return (T) load(pro, cl);
            } catch (IOException e) {
                System.err.println("加载配置文件失败");
                return null;
            }
        }
        
        return null;
    }

修改后代码

    public static <T> T load(String fileName, Class<T> cl) {
    	/*
    	public static final ProgramConfig config = load("loadFFmpeg.properties", ProgramConfig.class);
    	fileName,配置文件名称;cl,读入配置内容的装填对象
    	*/
    	
        InputStream is = cl.getResourceAsStream("/" + fileName);

        if (is != null) {
            Properties pro = new Properties();
            try {
                System.out.println("加载配置文件...");
                pro.load(is);
                System.out.println("加载配置文件完毕");
                return (T) load(pro, cl);
            } catch (IOException e) {
                System.err.println("加载配置文件失败");
                return null;
            }
        }
        
        return null;
	}

参考文章:
*.jar!\BOOT-INF\classes!*.xml没有此文件

当你尝试使用`javac`编译后的`.class`文件运行 Java 应用程序,如果遇到“无法到或无法加载主类”错误,可能是以下几个原因: 1. **拼写或路径错误**:检查你的主类名是否与指定的类名一致,并确保.class文件所在的目录结构与`main`函数中的`Class.forName()`或`java.lang.ClassLoader.getResource()`所指的路径匹配。 ```java public class Main { public static void main(String[] args) { try { Class<?> clazz = Class.forName("YourMainClass"); // 或者通过ClassLoader ClassLoader loader = Thread.currentThread().getContextClassLoader(); clazz = loader.loadClass("YourMainClass"); // 然后实例化并运行 } catch (ClassNotFoundException e) { System.out.println("无法到主类"); } } } ``` 2. **缺少启动类**:确保你的程序有一个公共无参构造器,因为`main`方法会自动调用这个构造器。如果没有,你需要显式地提供它。 3. **文件权限问题**:检查文件及目录是否有适当的读取权限。特别是如果你在非根目录下运行`java`命令,可能会有权限限制。 4. **classpath设置**:`java`命令需要知道如何到你的类。如果你在命令行中没有明确指定`-cp`或`CLASSPATH`,那么系统默认的类路径可能不足以到你的类。 5. **IDE环境配置**:如果是使用集成开发环境(IDE),如Eclipse或IntelliJ IDEA,确认你的项目设置了正确的类路径或者运行配置。 解决这类问题,你可以逐一排查上述原因,也可以查看具体的错误信息,它通常会给出更详细的提示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值