当前位置:  开发笔记 > 编程语言 > 正文

在kotlin函数中使用资源 - 不适用于胖罐(一个罐子)

如何解决《在kotlin函数中使用资源-不适用于胖罐(一个罐子)》经验,为你挑选了1个好方法。

我有以下代码:

fun main(args: Array) {
    val urlForCSR: URL = ClassLoader.getSystemClassLoader().getResource("merchant.id")
    // also tried ClassLoader.getSystemResource("merchant.id")
    ...

从intelliJ运行时,以下工作正常并找到资源.但是当使用捆绑的jar运行它时会给出一个NullPointerException.

资源路径: /src/main/resources/merchant.id

代码路径: /src/main/java/Route.kt

以下是Maven配置代码段:

    ...
    
        
            org.apache.maven.plugins
            maven-jar-plugin
            
                
                    
                        RouteKt 
                    
                
            
        

        
        
            org.dstovall
            onejar-maven-plugin
            1.4.4
            
                
                    
                        one-jar
                    
                
            
        
    

有没有其他的战争来获取上述资源的URL,这可以使用一个jar或其他方式制作一个胖罐.

Jar内容:

jar tf target/Route-1.0-SNAPSHOT.jar
META-INF/
META-INF/MANIFEST.MF
merchant.id
RouteKt$main$1.class
RouteKt.class
META-INF/maven/
META-INF/maven/groupId/
META-INF/maven/groupId/TokenGenerator/
META-INF/maven/groupId/TokenGenerator/pom.xml
META-INF/maven/groupId/TokenGenerator/pom.properties

一罐内容:

META-INF/MANIFEST.MF
main/Route-1.0-SNAPSHOT.jar
lib/kotlin-stdlib-0.1-SNAPSHOT.jar
lib/kotlin-runtime-0.1-SNAPSHOT.jar
lib/spark-core-2.3.jar
lib/slf4j-api-1.7.12.jar
lib/slf4j-simple-1.7.12.jar
lib/jetty-server-9.3.2.v20150730.jar
...

Jayson Minar.. 5

OneJar将您的所有代码打包到一个JAR文件中,该文件还包含lib/目录中的其他JAR文件,或者作为JAR外部其他目录中的引用(取决于您正在使用的onejar系统).它使用自定义类加载器来完成这项工作.因此,它会使您无法使用系统类加载器.

打败这种情况的一种方法是使用与您要加载的资源相同的JAR中的类,因此其类加载器可能正确地设置到资源的Narnia中的JAR或嵌套JAR或魔术位置:

val stream = MyClass::class.java.getResourceAsStream("/merchant.id")

MyClass来自同一个JAR的类在哪里merchant.id,并且资源的路径必须是前导的绝对路径/

请确保获取而不是可能无法使用的资源URL,因为它不是系统可理解的URL.例如,它可能会在JAR中为JAR生成一个URL,其余的Java不会理解file:/path/to/jarfile/bot.jar!/config/file.txt(或更糟糕!).它可以工作,但我不确定它是一个JAR内的JAR,里面有一个文件.

次要选择:

val stream = Thread.currentThread().contextClassLoader.getResourceAsStream("/merchant.id")

检查您的资源名称:

在您的问题中,您说要读取资源,merchant.id但随后显示JAR内容merchant.id.soft.applepaydev-v1.csr...如果您尝试加载此确切资源,请确保这些名称匹配.


onejar中的资源加载必须是自定义的,这很难看. 在一个资源的链接中,该资源讨论了与onejar的资源加载:

Java支持查找和打开资源的方法有很多种:

URL findResource(String resource):返回资源,如果未找到则返回null.

枚举findResources(String resource):返回与给定字符串匹配的资源URL的枚举

URL.openConnection():通过其URL打开与资源的连接.

One-Jar在One-Jar文件的上下文中支持所有这些机制,One-Jar文件可能包含具有重复资源的Jar文件.

这些问题是从这些其他Stack Overflow帖子中引用的,因此这几乎是一个重复的问题:

一个jar内的classpath资源通过sbt打包

如何获取Java JAR文件中的资源路径

使用OneJar时如何获取资源目录的URL?

Onejar和资源加载

谷歌搜索引发了更多的资源.



1> Jayson Minar..:

OneJar将您的所有代码打包到一个JAR文件中,该文件还包含lib/目录中的其他JAR文件,或者作为JAR外部其他目录中的引用(取决于您正在使用的onejar系统).它使用自定义类加载器来完成这项工作.因此,它会使您无法使用系统类加载器.

打败这种情况的一种方法是使用与您要加载的资源相同的JAR中的类,因此其类加载器可能正确地设置到资源的Narnia中的JAR或嵌套JAR或魔术位置:

val stream = MyClass::class.java.getResourceAsStream("/merchant.id")

MyClass来自同一个JAR的类在哪里merchant.id,并且资源的路径必须是前导的绝对路径/

请确保获取而不是可能无法使用的资源URL,因为它不是系统可理解的URL.例如,它可能会在JAR中为JAR生成一个URL,其余的Java不会理解file:/path/to/jarfile/bot.jar!/config/file.txt(或更糟糕!).它可以工作,但我不确定它是一个JAR内的JAR,里面有一个文件.

次要选择:

val stream = Thread.currentThread().contextClassLoader.getResourceAsStream("/merchant.id")

检查您的资源名称:

在您的问题中,您说要读取资源,merchant.id但随后显示JAR内容merchant.id.soft.applepaydev-v1.csr...如果您尝试加载此确切资源,请确保这些名称匹配.


onejar中的资源加载必须是自定义的,这很难看. 在一个资源的链接中,该资源讨论了与onejar的资源加载:

Java支持查找和打开资源的方法有很多种:

URL findResource(String resource):返回资源,如果未找到则返回null.

枚举findResources(String resource):返回与给定字符串匹配的资源URL的枚举

URL.openConnection():通过其URL打开与资源的连接.

One-Jar在One-Jar文件的上下文中支持所有这些机制,One-Jar文件可能包含具有重复资源的Jar文件.

这些问题是从这些其他Stack Overflow帖子中引用的,因此这几乎是一个重复的问题:

一个jar内的classpath资源通过sbt打包

如何获取Java JAR文件中的资源路径

使用OneJar时如何获取资源目录的URL?

Onejar和资源加载

谷歌搜索引发了更多的资源.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有