【问题标题】:Convert Java class structures to Python classes将 Java 类结构转换为 Python 类
【发布时间】:2018-09-12 19:33:04
【问题描述】:

我们正在努力避免在同时使用 Java 和 Python 的项目中出现重复代码。大部分代码库都使用 Java,由于机器学习环境中的流行,现在添加了 Python。

在未开发的场景中,我们会从某事开始。像 swagger 或 protobuf 并从生成的代码中派生模型。但这现在行不通。

J 类带有一些注解,它们针对 Java 8。

在研究过程中,我发现以下可能的途径将类的结构(没有方法)转换为 Python 类结构:

  1. 从 Java 类生成 XML 模式
  2. 从 xml 架构文件生成 Python 类

额外的好处:这两种语言在我们的项目中实际上是通过 XML 进行通信的,因此模式文件对其他用例很有帮助。我们使用 maven 构建 Java,因此最好将其包含在 maven 进程中。

我在 pom.xml 中包含了这个:

<!-- https://mvnrepository.com/artifact/org.codehaus.mojo/jaxb2-maven-plugin -->
<dependency>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.3.1</version>
</dependency>

以及默认插件配置

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>schemagen</id>
                    <goals>
                        <goal>schemagen</goal>
                    </goals>
                </execution>
            </executions>
            <!--
                Use default configuration, implying that sources are read
                from the directory src/main/java below the project basedir.

                (i.e. getProject().getCompileSourceRoots() in Maven-speak).
            -->
        </plugin>

但我得到一个错误

[ERROR] Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:2.3.1:schemagen (default-cli) on project common: JAXB errors arose while SchemaGen compiled sources to XML. -> [Help 1]       
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:jaxb2-maven-plugin:2.3.1:schemagen (default-cli) on project common: JAXB errors arose while SchemaGen compiled sources to XML.  

然后,我将 JSON Schemas 视为一种中介,但这并没有真正削减它,因为从 JSON 模式创建 Python 类源代码并不容易。

那么有没有办法从 Java 代码生成简单的“Pojo”Python 类?没有方法,没有复杂的交叉编译,只有一个简单的结构转换。我可以从 IntelliJ 中的 Java 文件生成 UML 图,所以所有信息都在那里,我只需要一个帮助转换的工具

【问题讨论】:

  • 我使用 python 库 generateDS 从 XSD 生成模型文件并取得了一些成功。这是一个链接:davekuhlman.org/generateDS.html 你可以给它一个 XSD,它会为你生成一个生成的模型。
  • 是的,我知道那个库。但是如上所述,从 Java 生成 XSD 文件对我来说并不成功。
  • 好吧,我以为你还在走那条路,我的错。如果您不反对继续这样做,那么查看该 JAXB 错误的堆栈跟踪也可能会有所帮助。
  • 看看这是否对您使用 JSON 模式方法有帮助? stackoverflow.com/questions/12465588/…
  • @TarunLalwani,不,因为它不生成类源代码。它只在运行时工作。我想要类代码,以便 PyCharm 或 vim 等在开发过程中做 IDE 支持。

标签: java python xml oop jaxb


【解决方案1】:

那么有没有办法从 Java 代码生成简单的“Pojo”Python 类?

我试过了,下面是解决方案:

考虑以下简单化Pojo.java

public class Pojo {
    private String string = "default";
    public int integer = 1;
    public String getString(){
        return string;
    }
}

解决方案需要 3 个阶段

1。 Java Pojo 到 JSON 架构

我可以找到以下选项:

  1. FasterXML/jackson-module-jsonSchema: 这是基础,下面的库也在内部使用。
  2. mbknor/mbknor-jackson-jsonSchema:上面官方引用,支持v4的json schema。
  3. reinert/JJSchema

使用下面的相关代码和选项1(也可以通过网站):

ObjectMapper MAPPER = new ObjectMapper();
JsonSchemaGenerator generator = new JsonSchemaGenerator(MAPPER);
JsonSchema jsonSchema = generator.generateSchema(Pojo.class);
System.out.println(MAPPER.writeValueAsString(jsonSchema));

得到下面的输出 json 模式字符串:

{"type":"object","id":"urn:jsonschema:Pojo","properties":{"string":{"type":"string"},"integer":{"type":"integer"}}}

2。 JSON Schema 后处理

这个阶段是必需的,主要是因为我发现对于简单的用例(至少),下面的步骤 3 需要一个强制具有 definitions 属性的 json 模式。我想这是因为不断发展的模式定义@http://json-schema.org/。此外,我们可以包含一个title 属性来指定下一步将生成的python 类的名称。

我们可以在上面 Step 1 的 java 程序中作为 post step 轻松完成这些。我们需要以下格式的 json 模式字符串:

{"definitions": {}, "title": "Pojo", "type":"object","id":"urn:jsonschema:Pojo","properties":{"string":{"type":"string"},"integer":{"type":"integer"}}}

注意只有"definitions": {}, "title": "Pojo"

3。 Python 类的 Json 架构

frx08/jsonschema2popo 似乎做得很好。

pip install jsonschema2popo
jsonschema2popo -o /path/to/output_file.py /path/to/json_schema.json

还有几点

  1. Java-Json 模式生成器将仅在输出中包含那些是公共的或具有公共 getter 的属性。
  2. 我认为,对于大规模迁移,注释 Java 类会很痛苦。否则,如果这对您可行,上述所有 java 库都提供了丰富的注释,您可以在其中指定属性是否是必需的等等。

【讨论】:

  • 我将研究这对更复杂的类型的效果如何并报告回来。但答案看起来很有希望且直观
【解决方案2】:

TechWalla @https://www.techwalla.com/articles/how-to-convert-java-to-python 有详细说明。看看对你有没有帮助。

在此处粘贴说明 第1步 下载并解压 java2python。您下载的文件是一个 gzip 文件,其中包含一个 tarball 文件;都是压缩方案,都可以用开源程序7zip解压。

第 2 步 将 java2python 文件夹的内容放在 C:\ 驱动器的根目录下。

第 3 步 打开命令提示符并导航到“C:\java2python\”,然后键入不带引号的“python setup.py install”。这将告诉 Python 解释器运行设置脚本并准备您的计算机。将目录更改为“C:\java2python\bin\”并保持窗口打开。

第 4 步 将要转换的 Java 文件复制到 java2python 下的 bin 子文件夹中。在命令行中,运行“j2py -i input_file.java -o output_file.py”,将 input_file 和 output_file 替换为您的文件名。

第 5 步 打开新的 Python 文件夹并阅读代码。它可能并不完美,因此您需要仔细检查它以确保从 Python 的角度来看它是有意义的。然而,即使花时间手动检查,您也可以从手动转换中节省大量时间

【讨论】:

【解决方案3】:
  1. JAX-WS 2.2 需要 JAXB 2.2 进行数据绑定。确保所有内容都已更新
  2. Schemagen 具有编译范围依赖性。
  3. 生成 xml 文件的最佳实践:

    提供带有XmlSchemapackage-info.java 文件:

    schemagen example.Address example\package-info.java

    使用@XmlType注解命名空间属性指定命名空间

    @XmlType(namespace="http://myNameSpace")

解决创建 xml 文件的问题后,尝试lxml’s objectify sub-package.minidom module 迭代 trought xml 元素并创建 Python 类。

【讨论】:

    猜你喜欢
    • 2017-09-27
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2014-06-26
    相关资源
    最近更新 更多