利用反射动态获取当前工程下的文件路径_并打成jar包

上一篇动态获取java中的文件路径

这一次我把它打包成jar包,方便随时导入使用。

新代码工程目录:

文件路径类FilePath.java:

package filepath;

import java.io.File;

public class FilePath  
{  
    //当前的工程下的路径  
    public static String getProjectPath()  
    {  
          
        return System.getProperty("user.dir").toString()+"\\";  
  
    }  
    
  //编译之后src下的文件路径,根据工程路径拼接  
    public static String getSrcPath()  
    {  
        return System.getProperty("user.dir").toString()+"\\bin\\";  
    }  
    //根据反射获取编译之后的src下面的文件路径  
    public static String getSrcPath(Class<?> class1)  
    {  
        String path = class1.getClassLoader().getResource("").toString();  
        // System.out.println("编译后src路径:"+path);//file:/D:/dev/workspase2Spring/XMLreader/bin/  
        int m = path.indexOf("/");// file:/<----点位到file:后面的反斜杠  
        path = path.substring(m + 1);// 从反斜杠之后的一位开始截取字符串  
        // System.out.println("编译后src路径:"+path);  
        return path;  
    }  
  //根据反射获取编译之后包下面的文件路径  
    public static String getPackagePath(Class<?> class1)  
    {  
	//获取包路径
        String thisPackagePath=class1.getResource("").toString();  
//        System.out.println("路径:"+thisPackagePath);  
        int m=thisPackagePath.indexOf("/");//去掉前面的file:  
        thisPackagePath=thisPackagePath.substring(m+1);  
//        System.out.println("路径:"+thisPackagePath);  
        return thisPackagePath;//返回当前包返回的路径。  
    }
    public static String getProjectPath(Class<?> class1)  
    {  
	//获取src路径
        String path = class1.getClassLoader().getResource("").toString();  
        // System.out.println("编译后src路径:"+path);//file:/D:/dev/workspase2Spring/XMLreader/bin/  
        //文件定位到src路径
        File file=new File(path);//定位到这个目录下面
        path=file.getParent();//返回src路径的父路径,也就是工程路径
//      结果 path=file:\D:\dev\workspase4javaBasis\FilePath
        int m = path.indexOf("\\");// file:\<----点位到file:后面的反斜杠  
        path = path.substring(m + 1);// 从反斜杠之后的一位开始截取字符串  
        // System.out.println("编译后src路径:"+path);  
        return path;  
    }  
  //  public static void main(String[] args)
  //  {
	//System.out.println(FilePath.getProjectPath(FilePath.class));
  //  }
}  

下面介绍怎么把这个工具类打成jar包,以便后面我们重复使用。

步骤如图:

这样就导出到你读路径下了,我这里是D:\dev\myJAR

进入你保存的目录,这是已经生成一个名为FilePath.jar的jar包了

然后接着在其他工程里导入这个jar包,就可以使用包下面的各种方法啦

导入的步骤:

然后到刚才保存的路径下选择你的jar包

新建一个测试类Test.java

Test.java代码:

package com.lan.testMyJar;

import filepath.FilePath;

public class Test
{
    public static void main(String[] args)
    {
	System.out.println("当前的包路径为:"+FilePath.getPackagePath(Test.class));
	System.out.println("当前的工程路径为:"+FilePath.getProjectPath());
	System.out.println("当前的工程路径为:"+FilePath.getPackagePath(Test.class));
	System.out.println("编译后的src路径为:"+FilePath.getSrcPath());
	System.out.println("编译后的src路径为:"+FilePath.getSrcPath(Test.class));
	
    }
}
说明:



运行测试类,结果:

可以看到这几个方法分别获到了编译之后的包路径,src路径(也就是bin),以及工程路径(工程路径不变)

下载我的FilePath.jar:刚上传后面再补上链接


### Spring Boot 可执行 JAR 文件实现插件式扩展 #### 创建可执行的 JAR 文件 为了创建一个可执行的 JAR 文件,Spring Boot 提供了一个非常方便的方式。通过 `spring-boot-maven-plugin` 或者 `spring-boot-gradle-plugin` 插件可以在构建过程中自动打应用程序及其依赖项到单个存档文件中。 ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` 这会生成一个含所有必要库和资源的标准 Java 存档 (JAR),可以直接运行而无需额外设置环境变量或手动复制库文件[^1]。 #### 支持插件化的机制设计 为了让这个 JAR 能够支持插件化——即动态加载其他接口的具体实现形式,有几种方法可以选择: ##### 使用 `-cp` 参数扩大 ClassPath 范围 最简单的方法之一就是利用命令行参数 `-Dloader.path=...` 来告诉应用服务器去哪里寻找附加的 JARs 和目录。这些路径会被添加到默认的应用程序上下文中被扫描以发现组件和服务提供者实例。 ##### 自定义 ClassLoader 进行动态加载 另一种更灵活的选择是编写自定义的类加载器来处理特定位置上的 JAR 文件。这种方式允许更加精细地控制哪些类应该被引入以及何时进行加载操作。例如,可以通过继承 `java.net.URLClassLoader` 重写其构造函数来完成这项工作[^3]。 ```java public class PluginClassLoader extends URLClassLoader { public PluginClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); } @Override protected synchronized void addURL(URL url){ super.addURL(url); } } ``` ##### 利用现有工具简化开发过程 考虑到实际项目的复杂度和技术栈的不同组合情况,有时候直接采用成熟的解决方案可能是更好的选择。比如开源项目 [Dynamicer](https://github.com/w757227129/dynamicer.git)[^4] 就是一个很好的例子,它提供了简单的 API 接口用于管理外部模块,且已经解决了许多潜在的问题如线程安全性和版本兼容性等。 #### 动态加载外部 JAR 中的内容作为 Bean 注册进容器内 当实现了上述任一方式之后,下一步就是要确保新加入的功能单元能成为 Spring 上下文的一部分以便于后续调用。通常情况下这意味着要将它们转换成标准的 Spring Beans 对象。一种常见的做法是在初始化阶段遍历目标名空间内的每一个候选对象通过反射机制获取其实现细节;接着再把这些信息传递给相应的工厂方法从而最终形成完整的 bean 定义记录表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值