Usar el recurso en kotlin func – no funciona con el flask de grasa (un flask)

Tengo el siguiente fragment de código:

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

Lo siguiente cuando se ejecuta desde intelliJ funciona bien y encuentra el recurso. Pero cuando se ejecuta usando el package incluido, da una NullPointerException .

  • Ruta de /src/main/resources/merchant.id al recurso: /src/main/resources/merchant.id
  • Ruta para el código: /src/main/java/Route.kt

Lo siguiente es el fragment de configuration de Maven:

  ... <!-- Make this jar executable --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>RouteKt</mainClass> <!-- Class generated (for above main func - named Route.kt) --> </manifest> </archive> </configuration> </plugin> <!-- Includes the runtime dependencies --> <plugin> <groupId>org.dstovall</groupId> <artifactId>onejar-maven-plugin</artifactId> <version>1.4.4</version> <executions> <execution> <goals> <goal>one-jar</goal> </goals> </execution> </executions> </plugin> </plugins> 

¿Hay alguna otra guerra para get URL para el recurso anterior que funcionaría con una jarra u otra forma de hacer una jarra de grasa.

Contenido 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 

Contenido de una jarra:

 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 empaqueta todo su código en un file JAR que también contiene otros files JAR en el directory lib/ o como reference en otros directorys fuera del JAR (dependiendo del sistema onejar que esté utilizando). Utiliza un cargador de classs personalizado para que esto funcione. Por lo tanto, anula el uso del cargador de classs del sistema.

Una forma de evitar esto es utilizar una class del mismo JAR que el recurso que desea cargar y, por lo tanto, su cargador de classs probablemente esté configurado correctamente en el JAR o JAR nested o en la location mágica en Narnia de su recurso:

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

Donde MyClass es una class del mismo JAR que merchant.id , y la ruta al recurso debe ser absoluta con el /

Asegúrese de get la transmisión y no la URL del recurso que podría no ser útil para usted, ya que no es una URL comprensible para el sistema. Podría generar una URL para un JAR dentro de un JAR que el rest de Java no entendería, por ejemplo file:/path/to/jarfile/bot.jar!/config/file.txt (¡o peor!). Podría funcionar, pero no estoy seguro de cuándo es un JAR dentro de un JAR con un file.

Una opción secundaria:

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

Comtesting tus nombres de resources:

En su pregunta, dice leer el recurso merchant.id pero luego muestra los contenidos de JAR que tienen merchant.id.soft.applepaydev-v1.csr … asegúrese de que estos nombres coincidan si está intentando cargar este recurso exacto.


La carga de resources en onejar debe personalizarse, lo que es feo. En un enlace a un recurso que habla sobre la carga de resources con onejar :

Hay varias forms en que Java admite encontrar y abrir resources:

  • URL findResource (recurso de cadena): devuelve un recurso, o nulo si no se encuentra.
  • Enumeración findResources (recurso de cadena): devuelve una enumeración de URL de recurso que coinciden con la cadena dada
  • URL.openConnection (): abre una connection a un recurso por su URL.

One-Jar admite todos estos mecanismos en el context de un file One-Jar, que puede contener files Jar que tienen resources duplicates.

A este problema se hace reference desde estas otras publicaciones de Desbordamiento de stack, por lo tanto, esta es prácticamente una pregunta duplicada:

  • Recursos de Classpath dentro de un package empaquetados a través de sbt
  • Cómo get una ruta a un recurso en un file Java JAR
  • ¿Cómo get una URL para un directory de resources cuando se usa OneJar?
  • Onejar y carga de resources

Google busca muchos más resources.