У меня есть проект maven, который автоматически генерирует некоторые классы, используя плагин JAXB в POM. Все в проекте работает нормально, проект собирается правильно и запускается без каких-либо проблем, однако IntelliJ не видит, что один из сгенерированных классов зависит от другого, поэтому постоянно сообщает мне, что в проекте есть проблемы.
Я могу решить эти предполагаемые проблемы, импортировав один из сгенерированных классов в другой, однако это противоречит смыслу автоматически сгенерированного класса!
Плагин JAXB в POM настроен следующим образом:
<plugin>
<groupId>org.jvnet.jaxb</groupId>
<artifactId>jaxb-maven-plugin</artifactId>
<version>4.0.6</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>src/main/resources/XSD</schemaDirectory>
<schemaIncludes>
<include>*.xsd</include>
</schemaIncludes>
</configuration>
</plugin>
Вызываемый XSD выглядит следующим образом:
<?xml version = "1.0" encoding = "UTF-8" ?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
<!-- Definition of the root element -->
<xs:element name = "Person">
<xs:complexType>
<xs:sequence>
<!-- First Name field -->
<!-- <xs:element name = "FirstName" type = "xs:string" />-->
<xs:element name = "FirstName" type = "NameType" />
<!-- Middle Name field -->
<xs:element name = "MiddleName" type = "xs:string" />
<!-- <xs:element name = "MiddleName" type = "NameType" />-->
<!-- Surname field -->
<!-- <xs:element name = "Surname" type = "xs:string" />-->
<xs:element name = "Surname" type = "NameType" />
<!-- Postcode field -->
<!-- <xs:element name = "Postcode" type = "xs:string" />-->
<xs:element name = "Postcode" type = "NameType" />
<!-- Date of Birth field -->
<xs:element name = "DateOfBirth" type = "DateType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Custom complex type for Name with value attribute -->
<xs:complexType name = "NameType">
<xs:attribute name = "value" type = "xs:string" use = "required" />
</xs:complexType>
<!-- Custom simple type for Date of Birth with format validation -->
<xs:simpleType name = "DateType">
<xs:restriction base = "xs:string">
<xs:pattern value = "\d{4}\d{2}\d{2}" /> <!-- Pattern for 'yyyyMMdd' -->
</xs:restriction>
</xs:simpleType>
</xs:schema>
На основе этого JAXB создал три автоматически сгенерированных класса: NameType, Person и ObjectFactory. Путь ко всем трем из них — target/generated-sources/xjc/generated.
сгенерированные источники помечены в IntelliJ как «Корень сгенерированных источников», и в настройках проекта я вижу, что target/generated-sources
, target/generated-sources/annotations
и target/generated-sources/xjc/generated
были добавлены в качестве исходных папок.
Чтобы IntelliJ не думал, что есть проблемы, я должен добавить import generated.NameType;
в класс Person и import generated.NameType; import generated.Person;
в ObjectFactory.
Есть ли настройка, которую я изменяю в IntelliJ, чтобы она распознавала эти вещи по умолчанию. Опять же, я повторяю, мой код создается и работает абсолютно нормально — эта проблема просто вызывает проблемы с такими вещами, как Git, от автоматической отправки, поскольку он считает, что есть ошибки, и обычно раздражает, когда говорят, что есть проблемы, когда их нет. т любой.
В случае, если что-либо из следующего имеет значение:
Я использую IntelliJ IDEA 2024.1.4 (Ultimate Edition) на Intel Mac под управлением 13.5.1, и общие свойства POM следующие:
<properties>
<compiler-plugin.version>3.12.1</compiler-plugin.version>
<maven.compiler.release>21</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>3.9.3</quarkus.platform.version>
<skipITs>true</skipITs>
<surefire-plugin.version>3.2.5</surefire-plugin.version>
</properties>
Кажется, ваша проблема в том, что вы добавили target/generated-sources/xjc/generated
вместо target/generated-sources/xjc
в качестве исходной папки в IntelliJ.
Для тестовых проектов в jaxb-tools структура проекта практически всегда следующая:
При этом вы можете видеть, что target/generated-sources/xjc
помечен как «сгенерированный» в исходных папках.
В этой папке у меня есть один пакет с именем generated
, поскольку в моем импортированном XSD не определено пространство имен (вам кажется, то же самое).
Просто исправьте свою конфигурацию, чтобы получить базовый каталог (как указано в свойстве плагина generateDirectory
, которое по умолчанию равно ${project.build.directory}/generated-sources/xjc
).
Вы также можете переопределить свойство плагина generatePackage
, чтобы ваш класс генерировался в другом пакете (например, com.foo.baz.bar
) вместо базового пакета generated
, который здесь используется по умолчанию.
Так должно быть по умолчанию (target/generate-sources/xjc
), но да, вы можете перейти к этим настройкам, используя свой метод.
Я думаю, что в моем случае это было не так, поскольку я изначально создал проект в коде Visual Studio, а затем перенес его в IntelliJ, поскольку он казался более функциональным для Java - поэтому я подозреваю, что у меня не было бы проблемы, если бы я построил его с нуля, используя IntelliJ.
В этом и была проблема: IntelliJ теперь правильно обращается ко всему. Чтобы добавить в будущем людей с такой же проблемой, вы можете перейти к этим настройкам исходной папки, перейдя в [Файл] [Структура проекта...], а затем выбрав [Модули] в разделе «Настройки проекта» во всплывающем окне.