如何在一个jar中分发包含jython代码的java包?

时间:2012-11-30 16:16:15

标签: java python distribution jython

我正在开发几个java包,然后将它们作为jar文件分发。 由于一些新的要求,我现在必须在jython中编写几个新功能;这些可能会涵盖分布在很多单独的jython文件上的相当多的代码。

我想继续为每个包分发一个jar文件。我的一些搜索为我提供了两种不幸的方法:

1)jythonc:我正在使用jython 2.5.1,因此jythonc不再是发行版的一部分。此外,我不喜欢这对我的jython代码的限制。

2)将所有内容与jython.jar文件一起打包。不幸的是,这是不可能的;所有使用我的代码包的人已经在他们的环境中有一个jython.jar文件(其中许多使用不同的版本)。换句话说,我的包必须在没有python核心的情况下分发;相反,我可以依赖它在目标系统的类路径中找到它。

现在问题仍然存在,是否有另一种方法将所有java和jython代码打包在一个jar中,同时保持jython.jar文件不变?

1 个答案:

答案 0 :(得分:1)

我终于找到了解决问题的方法。也许这也是其他人感兴趣的。 提醒一下,这适用于带有java的混合java / jython包,然后将其传递给客户,而不是用于自包含的应用程序。

1)使用工具“jar”(或任何其他zip工具)将所有jython源放在jar文件中顶层的单独文件夹中;我使用了文件夹“Lib”。

2)使用建模为单例的对象工厂类(类似于描述的here),从java访问jython代码;从jython访问java只需要完整的包名即可直接访问。

3)在对象工厂的构造函数中,我使用

  

String jarPath = myObjectFactory.class.getProtectionDomain().getCodeSource().getLocation() .getPath();

从代码中确定jar文件的位置。

4)我使用

将jar文件中的“Lib”文件夹添加到jython模块查找路径中
  

PySystemState newState = new PySystemState(); newState.path.insert(0,Py.newString(jarPath + java.io.File.separator + "Lib")); Py.setSystemState(newState);

只要jython.jar文件包含在类路径中,就可以了。