【发布时间】:2017-09-20 04:44:53
【问题描述】:
我有以下代码:
fun main(args: Array<String>) {
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 配置 sn-p:
...
<!-- 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>
是否有任何其他战争来获取上述资源的 URL,它可以使用一个 jar 或其他制作胖 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
...
【问题讨论】:
-
您的问题中缺少重要信息。
merchant.id位于源中的什么位置?您是否查看了胖罐子的内部并在那里也看到了这个文件?如果不存在,您是否查看过如何确保将资源复制到 fat jar 中?您是否阅读过其他 SO 文章,例如 stackoverflow.com/questions/5688329/…?还是stackoverflow.com/questions/23276836/…? -
@JaysonMinard 是的,文件在那里——正如问题中所说——这从 intelliJ 执行得非常好。资源路径:
/src/main/resources/代码路径:/src/main/java/Route.kt -
资源
merchant.id是否在 onejarlib/目录中的 JAR 中? IE。您的 onejar 胖 JAR 是myApp.jar,其中还有许多其他 JAR 文件在lib/dependency1.jarlib/dependency2.jar中,其中是您的merchant.id而不是顶级 jar? -
(注意,与从平面文件系统运行的 intellij 相比,OneJar 完全改变了类和资源的打包内容和方式)
-
当资源在胖 JAR 中的 JAR 中时,您会遇到以下问题:stackoverflow.com/questions/21361931/… 和 stackoverflow.com/questions/941754/… 和...并且 onejar 使用自己的类加载器,而不是系统加载器您正在使用:stackoverflow.com/a/20636830/3679676