Преобразование структур класса Java в классы Python
Мы пытаемся избежать дублирования кода в проекте, где Java и Python используются вместе. Большая часть базы кода находится на Java, а теперь добавляется Python из-за распространенности в среде машинного обучения.
В сценарии с зеленым полем мы начнем с sth. как взрослое или протобуф, и выводить модели из сгенерированного кода. Но теперь это не работает.
J-классы аннотируются некоторыми аннотациями и нацелены на Java 8.
Во время исследования я нашел следующий возможный путь, чтобы превратить структуру (без методов) классов в структуры классов Python:
- Создание XML-схем из классов Java
- Создание классов Python из файлов схемы xml
Дополнительное преимущество: два языка фактически взаимодействуют через 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 в качестве посредника, но это также на самом деле не режет его, потому что нелегко создать исходный код класса Python из схем JSON.
Так есть ли способ генерировать простые "Pojo" классы Python из Java-кода? Никаких методов, сложной кросс-компиляции, а простого структурного преобразования. Я могу генерировать UML-диаграммы из файлов Java в IntelliJ, поэтому вся информация есть, мне нужен инструмент, который помогает конвертировать
Ответы
Ответ 1
Так есть ли способ генерировать простые "Pojo" классы Python из Java-кода?
Я пошел на него, и ниже это решение:
Учитывая ниже упрощенное Pojo.java
public class Pojo {
private String string = "default";
public int integer = 1;
public String getString(){
return string;
}
}
Для решения потребуется 3 фазы
1. Java Pojo для JSON Schema
Я могу найти ниже варианты:
- FasterXML/jackson-module-jsonSchema: Это база, которая под библиотеками также используется внутри.
- mbknor/mbknor-jackson-jsonSchema: Официально цитируется выше для поддержки v4 json-схемы.
- Рейнер/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
Эта фаза требуется в основном потому, что я обнаружил, что для упрощенного варианта использования (по крайней мере) для шага 3
ниже нужна json-схема, которая имеет свойство definitions
мандатно. Думаю, это из-за меняющихся определений схемы @http://json-schema.org/. Кроме того, мы можем включить свойство title
чтобы указать имя класса python, который будет генерировать следующий шаг.
Мы можем легко выполнить их в java-программе этапа 1
выше в качестве пост-шага. Нам нужна строка схемы json ниже формы:
{"definitions": {}, "title": "Pojo", "type":"object","id":"urn:jsonschema:Pojo","properties":{"string":{"type":"string"},"integer":{"type":"integer"}}}
Обратите внимание, что только добавление - это "definitions": {}, "title": "Pojo"
3. Схема Json для класса Python
Кажется, что frx08/jsonschema2popo делает эту работу довольно хорошо.
pip install jsonschema2popo
jsonschema2popo -o /path/to/output_file.py /path/to/json_schema.json
Еще несколько пунктов
- Генераторы схемы Java-Json будут включать только те свойства в выходном файле, которые являются либо общедоступными, либо имеют публичный getter.
- Я предполагаю, что для массовой миграции аннотирование классов 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, который будет преобразован в вашу подпапку bin, под java2python. В командной строке запустите "j2py -i input_file.java -o output_file.py", заменив файл input_file и output_file вашими именами файлов.
Шаг 5 Откройте новую папку Python и прочитайте код. Это, вероятно, не будет идеальным, поэтому вам нужно будет пройти его, чтобы убедиться, что это имеет смысл с точки зрения Python. Тем не менее, даже проводя время вручную, вы сохраните большое количество времени от ручной конвертации
Ответ 3
- JAX-WS 2.2 требует JAXB 2.2 для привязки данных. Убедитесь, что все обновлено
- Schemagen имеет зависимость от области компиляции.
-
Рекомендации по генерации XML файла:
Предоставьте файл package-info.java
с помощью XmlSchema
:
schemagen example.Address example\package-info.java
Используйте @XmlType
пространства имен аннотации @XmlType
чтобы указать пространство имен
@XmlType(namespace="http://myNameSpace")
После устранения проблемы при создании файла xml попробуйте lxmls objectify sub-package. или minidom для итерации xml-элементов и создания классов Python.