在kotlin func中使用资源-无法使用fat jar(一个jar)

在kotlin func中使用资源-无法使用fat jar(一个jar),kotlin,onejar,Kotlin,Onejar,我有以下代码: fun main(args: Array<String>) { val urlForCSR: URL = ClassLoader.getSystemClassLoader().getResource("merchant.id") // also tried ClassLoader.getSystemResource("merchant.id") ... 是否有任何其他战争,以获得上述资源的URL,这将与一个罐子或其他方式使一个胖罐子工作 Ja

我有以下代码:

fun main(args: Array<String>) {
    val urlForCSR: URL = ClassLoader.getSystemClassLoader().getResource("merchant.id")
    // also tried ClassLoader.getSystemResource("merchant.id")
    ...
是否有任何其他战争,以获得上述资源的URL,这将与一个罐子或其他方式使一个胖罐子工作

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
...
一罐内容:

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
...

OneJar将所有代码打包到一个JAR文件中,该文件还包含
lib/
目录中的其他JAR文件,或者作为JAR外部其他目录中对它们的引用(取决于您使用的OneJar系统)。它使用自定义类加载器来实现这一点。因此,它无法使用系统类加载器

解决此问题的一种方法是使用与要加载的资源来自同一个JAR的类,因此其类装入器可能已正确设置到资源的JAR或嵌套JAR或Narnia中的magic位置:

val stream = MyClass::class.java.getResourceAsStream("/merchant.id")
其中,
MyClass
是来自与
merchant.id
相同JAR的类,并且到资源的路径必须是绝对的,前面的
/

确保获取,而不是可能对您不可用的资源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")
检查您的资源名称:

val stream = Thread.currentThread().contextClassLoader.getResourceAsStream("/merchant.id")
在您的问题中,您要求阅读resource
merchant.id
,但随后显示包含
merchant.id.soft.applepaydev-v1.csr的JAR内容。。。如果您正试图加载此确切的资源,请确保这些名称匹配


onejar中的资源加载必须自定义,这很难看:

Java支持多种方式查找和打开资源:

  • URL findResource(字符串资源):返回资源,如果找不到,则返回null
  • 枚举findResources(字符串资源):返回与给定字符串匹配的资源URL的枚举
  • openConnection():通过资源的URL打开与资源的连接
One Jar在One Jar文件的上下文中支持所有这些机制,该文件可能包含具有重复资源的Jar文件

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


谷歌搜索提供了更多的资源。

OneJar将您的所有代码打包成一个JAR文件,该文件还包含
lib/
目录中的其他JAR文件,或者作为JAR之外其他目录中的JAR文件的引用(取决于您使用的OneJar系统)。它使用自定义类加载器来实现这一点。因此,它无法使用系统类加载器

解决此问题的一种方法是使用与要加载的资源来自同一个JAR的类,因此其类装入器可能已正确设置到资源的JAR或嵌套JAR或Narnia中的magic位置:

val stream = MyClass::class.java.getResourceAsStream("/merchant.id")
其中,
MyClass
是来自与
merchant.id
相同JAR的类,并且到资源的路径必须是绝对的,前面的
/

确保获取,而不是可能对您不可用的资源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")
检查您的资源名称:

val stream = Thread.currentThread().contextClassLoader.getResourceAsStream("/merchant.id")
在您的问题中,您要求阅读resource
merchant.id
,但随后显示包含
merchant.id.soft.applepaydev-v1.csr的JAR内容。。。如果您正试图加载此确切的资源,请确保这些名称匹配


onejar中的资源加载必须自定义,这很难看:

Java支持多种方式查找和打开资源:

  • URL findResource(字符串资源):返回资源,如果找不到,则返回null
  • 枚举findResources(字符串资源):返回与给定字符串匹配的资源URL的枚举
  • openConnection():通过资源的URL打开与资源的连接
One Jar在One Jar文件的上下文中支持所有这些机制,该文件可能包含具有重复资源的Jar文件

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


谷歌搜索提供了更多的资源。

您的问题缺少重要信息。
merchant.id
位于源中的何处?你有没有在胖罐子里面看到这个文件?如果它不在那里,您是否考虑过如何确保将资源复制到胖罐子中?你读过其他像这样的文章吗?或者?@JaysonMinard是的,文件就在那里——正如问题中所说的那样——它从intelliJ执行得非常好。资源路径:
/src/main/resources/
代码路径:
/src/main/java/Route.kt
是onejar
lib/
目录下JAR中的资源
merchant.id
?也就是说,您的onejar胖JAR是
myApp.JAR
,其中有许多其他JAR文件,位于
lib/dependency1.JAR
lib/dependency2.JAR
中,其中是您的
merchant.id
而不是顶级JAR?(注意,在intellij中工作并不是相关信息,因为OneJar完全改变了类和资源的打包内容和方式。)