如何访问jar中的静态资源(对应于src/main/resources文件夹)?

2024-06-28

我有一个火花流 https://spark.apache.org/streaming/使用 Maven(作为 jar)构建并使用spark-submit脚本。应用程序项目布局遵循标准目录布局:

myApp
    src
        main
            scala
                com.mycompany.package
                      MyApp.scala
                      DoSomething.scala
                      ...
            resources
                aPerlScript.pl
                 ...
        test
           scala
                com.mycompany.package
                      MyAppTest.scala
                      ...
        target
           ...
pom.xml

In the DoSomething.scala对象我有一个方法(我们称之为doSomething()) 尝试执行 Perl 脚本 --aPerlScript.pl(来自resources文件夹)——使用scala.sys.process.Process并向脚本传递两个参数(第一个参数是用作输入的二进制文件的绝对路径,第二个参数是生成的输出文件的路径/名称)。我然后打电话DoSomething.doSomething().

问题是我无法访问脚本,不能使用绝对路径、相对路径、getClass.getClassLoader.getResource、getClass.getResource,我已在我的资源文件夹中指定了资源文件夹pom.xml。我的尝试都没有成功。我不知道如何找到我放在 src/main/resources 中的东西。

我将不胜感激任何帮助。

附注:

  • 我使用外部进程而不是 Spark 管道,因为在工作流程的这一步,我必须处理二进制文件作为输入和输出。
  • 我正在使用 Spark-streaming 1.1.0、Scala 2.10.4 和 Java 7。我从 Eclipse (Kepler) 中使用“Maven install”构建 jar
  • 当我使用getClass.getClassLoader.getResource访问资源的“标准”方法我发现实际的类路径是spark-submit脚本就是其中之一。

有几种解决方案。最简单的是使用 Scala 的流程基础设施:

import scala.sys.process._

object RunScript {
  val arg = "some argument"
  val stream = RunScript.getClass.getClassLoader.getResourceAsStream("aPerlScript.pl")
  val ret: Int = (s"/usr/bin/perl - $arg" #< stream).!
}

在这种情况下,ret是进程的返回代码,进程的任何输出都定向到stdout.

第二种(更长)的解决方案是复制文件aPerlScript.pl从 jar 文件到某个临时位置并从那里执行它。此代码片段应该包含您需要的大部分内容。

object RunScript {
  // Set up copy destination from the Java temporary directory. This is /tmp on Linux
  val destDir = System.getProperty("java.io.tmpdir") + "/"
  // Get a stream to the script in the resources dir
  val source = Channels.newChannel(RunScript.getClass.getClassLoader.getResourceAsStream("aPerlScript.pl"))
  val fileOut = new File(destDir, "aPerlScript.pl")
  val dest = new FileOutputStream(fileOut)
  // Copy file to temporary directory
  dest.getChannel.transferFrom(source, 0, Long.MaxValue)
  source.close()
  dest.close()
}
// Schedule the file for deletion for when the JVM quits
sys.addShutdownHook {
  new File(destDir, "aPerlScript.pl").delete
}
// Now you can execute the script.

这种方法允许您将本机库捆绑在 JAR 文件中。将它们复制出来可以在运行时加载库,以应对您计划的任何 JNI 恶作剧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问jar中的静态资源(对应于src/main/resources文件夹)? 的相关文章

随机推荐

  • Scala Play 2.3 IntelliJ 14 *社区版 - 是否可以在没有命令行激活器命令的情况下运行项目

    From http blog jetbrains com scala 2012 12 28 a new way to compile http blog jetbrains com scala 2012 12 28 a new way to
  • django admin 中内联模型的分页器

    我有这个简单的 django 模型 由一个传感器和特定传感器的值组成 每个日射强度计的值数量很多 gt 30k 是否可以以某种方式分页PyranometerValues在特定日期或一般情况下将分页器应用于管理内联视图 class Pyran
  • Swift 3 和 Xcode8 - init 的使用不明确

    在我安装 Xcode 8 并将项目转换为 Swift 3 之前 以下行没问题 现在转换后看起来像这样 let valueData Data Data bytes UnsafePointer
  • 如何将 NSAppTransportSecurity 添加到 Cordova 项目

    我正在从事一个 ionic cordova 项目 该应用程序需要配置 iOS 9 版本的应用程序传输安全例外 有谁知道如何将以下配置添加到 cordova 项目配置文件中 配置 xml
  • Microsoft SQL 数据库的 WebSocket 侦听器

    我目前正在开发一个项目 该项目必须使用 WebSockets 作为将数据传输到客户端的方式 基础设施看起来像这样 客户端 gt Web 服务器 gt Microsoft SQL 数据库 我想最理想的情况应该是这样的 客户端打开一个到服务器的
  • android.view.WindowLeaked - 使用对话框和新意图时

    我已经尝试了 stackoverflow 上提供的所有可能的解决方案 但我仍然在 logcat 中遇到此错误 活动 com xyz MainActivity 泄露了最初在此处添加的窗口 com android internal policy
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav
  • FCM(Firebase Cloud Messaging)如何发送到所有手机?

    我创建了一个小型应用程序 能够从 FCM 控制台接收推送通知 我现在想做的是向所有使用 API 安装应用程序的 Android 手机发送推送通知 这就是我完全迷失的地方 有没有办法在不收集所有注册ID的情况下将其发送到所有手机 这是否仅适用
  • 在 Python ssl 客户端/服务器的情况下自动输入密码短语

    我需要创建客户端 服务器应用程序以将文件从客户端发送到服务器 我使用简单的 ssl 套接字并使用证书进行身份验证 ms socket socket socket AF INET socket SOCK STREAM ssl sock ssl
  • 使用 CASE 语句的多个条件

    我需要查询一些数据 这是我构建的查询 但对我来说效果不佳 在本示例中 我使用 AdventureWorks 数据库 SELECT FROM Purchasing Vendor WHERE PurchasingWebServiceURL LI
  • 如何排除文件/文件夹以删除[重复]

    这个问题在这里已经有答案了 如何删除文件夹中的所有内容并排除特定文件夹和文件 以 tar 为例 tar exclude folder 编辑 我可以删除文件和文件夹 注意 运行以下命令时请小心 find type f grep v NameT
  • 如何滚动具有 3 个列表视图的布局

    我有一种布局 此布局包含 3 个列表视图 列表视图中的 wrap content 数据的高度不固定 当Listview有一个liitel巨大的数据时 数据会转到下面并且数据无法看到 所以我想用所有三个Listview滚动视图 这是怎么可能的
  • WHQL认证过程有多痛苦?

    您能估计一下 WHQL Windows 硬件徽标 认证过程有多痛苦吗 我看到有一个 43 页的分步指南 其中第一步是安装 Windows Server 2008 R2 x64 提交之前完成整个准备过程大约需要多长时间 然后需要多长时间才能得
  • 数据透视表、页面过滤器 - 使用日期过滤

    我正在尝试过滤具有日期值的页面过滤器 但我在使用时不断出现错误 PivotFilters Add type xlBefore value 5 1 2015 我还尝试了下面的代码 Dim nd As Long nd CLng Date 90
  • 如何扩展现有的 SASS 引导网格类

    我试图让我的代码更干净 所以我有类似的东西 div class col sm 6 col md 6 div class feature list item div class feature list item icon container
  • 张量流错误utf-8 OS X Sierra

    我已经在 OS X Sierra 上安装了 TensorFlow 和 Anaconda 我在安装过程中没有遇到任何问题 写出典型的例子 import tensorflow as tf a tf constant 5 name input a
  • 选择仅属于特定部门的用户

    我有下表 其中包含两个字段 即 a 和 b 如下所示 create table employe empID varchar 10 department varchar 10 插入一些记录 insert into employe values
  • 如何在 Windows 中安装“posix”

    我正在 Windows 7 中使用 WAMP 服务器并尝试使用posixphp 中的函数 但它不起作用并且给出fatal error undefined function 现在我想知道如何在 Windows 上安装它 如果它不适用于 Win
  • 涉及随机数的单元测试算法

    我正在编写一些关于分形和随机地形生成的代码 具体来说 我现在正在使用 Diamond Square 算法 对于那些不知道的人来说 它基本上每一步都会获得四个值的平均值 并添加一个随机数 我将如何测试结果 我应该使用已知的种子并手动计算平均值
  • 如何访问jar中的静态资源(对应于src/main/resources文件夹)?

    我有一个火花流 https spark apache org streaming 使用 Maven 作为 jar 构建并使用spark submit脚本 应用程序项目布局遵循标准目录布局 myApp src main scala com m