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

时间:2018-03-27 11:47:38

标签: python buck python-pex

我不是一个Python开发人员,所以如果这个问题没有多大意义我很抱歉..

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

我一直在尝试使用BUCK python_binary来实现此目的,但是,似乎我不能将jar添加为pex的依赖项。

编辑1

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

BUCK文件

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 env引用jar文件。解决方法是将pex资源解压缩到tmp文件夹中并从那里执行所有操作。

1 个答案:

答案 0 :(得分:2)

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