由于ClassLoader#getResources(name)方法提供的资源加载能力非常有限,不支持递归和搜索的特性,但是开发一个框架往往需要按照约定或配置去加载一些当前项目的资源或者扫描指定包目录下的类,LoadKit能提供非常便利的API以满足需求。
纯JDK的API,无第三方依赖。
支持多种路径风格的资源加载。
完全惰性加载,避免性能浪费。
可自定义资源过滤器实现精确加载。
底层支持file 和 jar 两个URL协议,满足绝大部分项目需求。
传递URLStreamHandler,支持自定义的URLStreamHandler。
JDK 1.5 +
<project> <!-- 设置 jitpack.io 仓库 --> <repositories> <repository> <id>jitpack.io</id> <url>https://www.jitpack.io</url> </repository> </repositories> <!-- 添加 LoadKit 依赖 --> <dependencies> <dependency> <groupId>com.github.core-lib</groupId> <artifactId>loadkit</artifactId> <version>LATEST_VERSION</version> </dependency> </dependencies> </project>
// 从当前的classpath中加载io/loadkit目录的资源,但不递归加载子目录。 Loaders.std().load("io/loadkit");
// 从当前的classpath中加载io目录的资源,而且递归加载子目录。 Loaders.std().load("io", true);
// 从当前的classpath中加载io以及所有递归子目录并且名称以Loader.class结尾的资源。 Loaders.std().load("io", true, (name, url) -> name.endsWith("Loader.class"));
// 上面的API默认采用的时当前线程的上下文类加载器,如果上下文类加载器不存在时则采用ClassLoader.getSystemClassLoader(); // 同时也可以采用下面的方式指定类加载器。 Loaders.std(otherClassLoader);
// 当加载某个package下的类资源时也要用路径的方式来写包名的话其实不太直观,这时可以采用pkg资源加载器。 Loaders.pkg().load("io.loadkit"); // 不递归 Loaders.pkg().load("io.loadkit", true); // 递归 // 递归加载io.loadkit包下名称以Loader.class结尾的资源 Loaders.pkg().load("io.loadkit", (name, url) -> name.endsWith("Loader.class"));
// package资源加载器实际上是一个委派加载器,只是内部将包名转换成路径方式然后委派给实际的资源加载器。 // 缺省情况下采用的是Loaders.std()资源加载器,也可以通过指定ClassLoader和delegate,实现更灵活的资源加载方式。 Loaders.pkg(otherClassLoader); Loaders.pkg(Loaders.std(otherClassLoader));
// 在package资源加载器中要加载io.loadkit包下的名称Loader.class结尾的资源是需要自定义过滤器, // 即便使用了Lambda表达式,但是采用ANT表达式就更简洁。 // * 任意个字符,但不包括子目录 // ** 任意个字符,而且包括子目录 // ? 单个字符,可以使用多个表达多个字符,例如:load??? 可匹配loadkit 但不匹配loader Loaders.ant().load("io/loadkit/*Loader.class");
// 上面的ANT风格路径的资源加载器加载io.loadkit包的资源时,需要用 “/” 来分隔目录,用来加载包资源不太直观。 // 这时可以采用delegate模式用package资源加载器去包装一个ANT资源加载器, // 让资源加载同时拥有package 和 ant 两个加载器的解析能力。 Loaders.pkg(Loaders.ant()).load("io.loadkit.*"); // 加载 io.loadkit.*
// 有ANT表达式的资源加载器,自然也会有正则表达式的资源加载器。 Loaders.regex().load("io/loadkit/\\w+Loader.class"); // 加载 io.loadkit包下名称以Loader.class 结尾的资源。
// Loader#load(); 方法只接收一个Filter参数,当过滤逻辑比较多而且不好写在一个过滤器,当然这样的类也是违背了"单一职责原则"的。 Filters.and(Filter...filters); // AND 连接的混合过滤器 Filters.or(Filter...filters); // OR 连接的混合过滤器 // 来将多个子过滤器混合成一个过滤器,或者: Filters.all(Filter...filters); // AND 连接的混合过滤器的另一种表达方式 Filters.any(Filter...filters); // OR 连接的混合过滤器的另一种表达方式
v1.0.0
第一个正式版发布
loadkit-v1.0.0.jar java打包成jar对其进行加密处理防止反编译 链接:https://pan.baidu.com/s/1jFR–y0_0yPhaj-o0wYtjw?pwd=fst8 提取码:fst8
问题内容: 在Java中,您可以使用相同的API,但使用不同的URL协议来加载各种资源: 这很好地将资源的实际加载与需要资源的应用程序分离开来,并且由于URL只是一个字符串,因此资源加载也很容易配置。 是否有使用当前类加载器加载资源的协议?这类似于Jar协议,除了我不需要知道资源来自哪个jar文件或类文件夹。 我当然可以使用来做到这一点,但这需要我使用不同的API,因此需要对现有代码进行更改。我希
问题内容: 我发现阅读编码风格指南是了解某种语言及其特性的最佳方法。我一直在努力寻找Java的良好文档,并立即回答一些问题。 首先,长行的惯例是什么?用Java和C / C ++编写都使我在这一点上产生很多困惑。 其次,创建自定义异常类的准则是什么?我通常会抛出一个现有的异常,而不是创建自己的异常。通常执行自定义异常创建吗? 问题答案: 查看Java TM编程语言 的官方代码约定。
我正在尝试将资源csv文件传递到我的Sprint Boot应用程序使用的jar中。尽管方法获取的资源参数=ReactiveWebContext资源[src/main/Resources/file.csv],但我总是得到该文件不存在的响应 > 在我的项目中,文件位于src/main/resources/file中。csv 正在应用中。属性,我定义: 在config类中: 在内部jar:Config类
本文将介绍 Weex 中 uri(url) 的用法。包括使用图像、字体等资源,处理相对路径以及如何访问本地及打包的资源文件。 Schemes 本地资源 Weex SDK 提供 local scheme 来访问打包在应用程序中的资源,此 scheme 无法在 H5 环境下使用。目前,开发者可以在 image 组件和字体文件中使用本地资源。 在 iOS 中,Weex 会在 bundle resourc
问:什么是加载资源的正确解决方案(从类路径和/或一般情况下)?Spring文档中提倡使用:http://docs.Spring.io/Spring/docs/current/spring-framework-reference/html/beans.html#context-introduction 问:为什么autowired字段仍然为空?
问题内容: 在关于类加载方法之间差异的一个流行答案中,乔恩·斯凯特(Jon Skeet)说, 类加载器资源路径始终被视为绝对路径。 一个更受欢迎的答案通过一个例子肯定了这一说法。 将所有路径视为绝对路径。因此,调用 和 都会在您的类路径中的以下位置查找文件: 。 忽略示例无法编译的事实,共识表明领先的正斜杠与ClassLoader无关。 一个简单的测试则相反。 我只是将路径添加到测试项目的类路径中
我有一个文件夹和包结构,如下所示 null null 致以最诚挚的问候 编辑:使用windows可能有不同的语法
我正在用Java编写一个JSON风格的查询引擎,它将受益于通过DOM路径查询JSON文档的能力(就像在Javascript中一样)。我查过格森和杰克逊,但他们似乎都不支持这一点。 有谁知道有什么替代方案或其他建议而不是我自己的? 例如