gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:45:16 25 4
gpt4 key购买 nike

我有一个 Spark 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

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 安装”构建 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.

此方法允许您将 native 库捆绑在 JAR 文件中。将它们复制出来允许在运行时为您计划的任何 JNI 恶作剧加载库。

关于scala - 如何访问 jar 中的静态资源(对应于 src/main/resources 文件夹)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26061096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com