是否可以创建一个包含 JAR 作为依赖项的 pex?

Is it possible to create a pex with a JAR included as dependency?

我不是一个Python开发者,如果这个问题没有太大意义,我很抱歉..

我目前在一个项目中工作,该项目包含一个与用 Java 编写的服务器通信的 py 脚本。脚本的相当一部分专门用于根据执行脚本的当前工作目录 (cwd) 查找服务器 jar 所在的位置。我虽然可以将脚本和服务器 jar 打包成某种 zip,我可以以独立的方式分发和执行,删除从脚本中获取 jar 的整个逻辑。 可以吗?

我一直在尝试使用 BUCK python_binary 来达到这个目的,但是,我似乎无法将 jar 添加为 pex 的依赖项。


编辑 1

按照@sdwilsh 的建议,我能够使用 BUCK 创建一个包含 jar 的 pex,但是,每当我尝试从主 python 脚本访问它时,它都会失败,因为找不到 jar:

降压文件

java_library(
  name = 'src_main',
  srcs = glob(['src/main/java/**/*.java']),
  source = '8',
  target = '8',
  visibility = [
    'PUBLIC',
  ],
)

java_binary(
  name = 'sample_jar',
  main_class = 'br.com.samples.jar.Main',
  deps = [':src_main'],
  visibility = [
    'PUBLIC',
  ],
)

python_library (
  name = 'jarlib',
  resources = [':sample_jar'],
)

python_binary(
  name = 'wrapper',
  main = 'wrapper.py',
  deps = [':jarlib'],
)

PEX内容

-rw-r--r--  1 staff    1319 Mar 28 13:07 sample_jar
-rw-r--r--  1 staff     259 Mar 28 13:15 wrapper.py
-rw-r--r--  1 staff     308 Mar 28 13:15 wrapper.pyc
-rw-r--r--  1 staff     917 Mar 28 13:15 __main__.pyc
-rw-r--r--  1 staff     737 Mar 28 13:15 __main__.py
-rw-r--r--  1 staff     242 Mar 28 13:15 PEX-INFO

wrapper.py

import sys, subprocess

process = subprocess.Popen(['java', '-jar', 'sample_jar'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.communicate()

wrapper.py

的输出
('', 'Error: Unable to access jarfile sample_jar\n')

编辑 2

看来我们无法从 PEX 环境中引用 jar 文件。解决方法是将 pex 资源解压缩到 tmp 文件夹中,然后从那里执行所有操作。

可以,但是您需要使用 python_library 并在 resources 参数中添加生成 java_binary 的规则。