【发布时间】:2012-09-15 23:26:17
【问题描述】:
我需要在 Clojure 库中重用一些 python 代码。我想将 python 脚本与我的 .jar 捆绑在一起,但据我所知,这意味着 python 将无法轻松访问这些脚本,因为它们将被打包在 jar 文件中。
有没有办法指定 .jar 的资源必须直接放在文件系统中,以便外人可以访问它们?
【问题讨论】:
我需要在 Clojure 库中重用一些 python 代码。我想将 python 脚本与我的 .jar 捆绑在一起,但据我所知,这意味着 python 将无法轻松访问这些脚本,因为它们将被打包在 jar 文件中。
有没有办法指定 .jar 的资源必须直接放在文件系统中,以便外人可以访问它们?
【问题讨论】:
JAR 标准中没有内置“auto-extract = true”功能。您必须推出自己的解决方案。
您有几种不同的选择:
1) JAR 文件基本上是 zip 档案。因此,外人可以通过将 JAR 作为 zip 读取来访问脚本。您可以在您的应用程序中提供一个 bash 脚本,该脚本使用 unzip 从您的文件中提取脚本。
2) 在 Maven 中,您可以使用 Dependency plugin's dependency:unpack 目标从 jar 中提取脚本,以便将它们放置在您的分发程序集中更合适的位置。所以使用这样的东西(下面是未经测试的):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.augustl</groupId>
<artifactId>scripts</artifactId>
<version>1.0.0</version>
<type>jar</type>
<overWrite>false</overWrite>
<outputDirectory>${project.build.directory}/scripts</outputDirectory>
<includes>**/*.py</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
3) 在您的应用程序中,您可以将脚本读取为InputStream,并将其写入临时文件以执行。只要您的脚本有一个相当独特的名称,使用Class.getResourceAsStream(String name) 就很简单
另见:
【讨论】: