1

XJC 2.2.4-2 とエピソード ファイルを使用してプロキシ クラスを生成しようとしています。最初のエピソードの生成は amazon.xsd を使用してうまく機能しましたが、エピソードを使用する後続のリクエストは失敗しています。

xmlbeansscompコマンドも試しましたが、これも失敗します。

私が実行しているコマンドは次のとおりです。

xjc.exe -extension -b amazon.episode amzn-base.xsd new はすべての xsd ファイルを scomp -src amazonGeneratedClasses -out feedsApi.jar new含むディレクトリです。

どの出力:

【XJC】

parsing a schema...
[ERROR] SCD "AmazonOnly" didnt match any schema component
  line 69 of file:/C:/Users/roberth/Programming_Projects/new/amazon.episode

[ERROR] SCD "Amazon-Vendor-Only" didnt match any schema component
  line 60 of file:/C:/Users/roberth/Programming_Projects/new/amazon.episode

Failed to parse a schema.

60 行目:

 <jaxb:bindings scd="Amazon-Vendor-Only">
      <jaxb:class ref="amazon.AmazonVendorOnly"/>
    </jaxb:bindings>

69 行目:

  <jaxb:bindings scd="Amazon-Only">
      <jaxb:class ref="amazon.AmazonOnly"/>
    </jaxb:bindings>

ファイル amazon.AmazonVendorOnly および amazon.AmazonOnly は存在します。

[XmlBeans]

MerchantListingsReport.xsd:27:8: error: Invalid QName value: Can't resolve prefix 'tns'
amzn-header.xsd:17:5: error: sch-props-correct.2: Duplicate global element: Header (Original global element found in file: aces.xsd)
AmazonACES.xsd:109:2: error: sch-props-correct.2: Duplicate global element: Aspiration (Original global element found in file: aces.xsd)
AmazonACES.xsd:118:2: error: sch-props-correct.2: Duplicate global element: BaseVehicle (Original global element found in file: aces.xsd)
AmazonACES.xsd:127:2: error: sch-props-correct.2: Duplicate global element: BedLength (Original global element found in file: aces.xsd)
AmazonACES.xsd:136:2: error: sch-props-correct.2: Duplicate global element: BedType (Original global element found in file: aces.xsd)
AmazonACES.xsd:145:2: error: sch-props-correct.2: Duplicate global element: BodyNumDoors (Original global element found in file: aces.xsd)
AmazonACES.xsd:154:2: error: sch-props-correct.2: Duplicate global element: BodyType (Original global element found in file: aces.xsd)
AmazonACES.xsd:163:2: error: sch-props-correct.2: Duplicate global element: BrakeABS (Original global element found in file: aces.xsd)
AmazonACES.xsd:172:2: error: sch-props-correct.2: Duplicate global element: BrakeSystem (Original global element found in file: aces.xsd)
AmazonACES.xsd:181:2: error: sch-props-correct.2: Duplicate global element: CylinderHeadType (Original global element found in file: aces.xsd)
AmazonACES.xsd:190:2: error: sch-props-correct.2: Duplicate global element: DisplayOrder (Original global element found in file: aces.xsd)
AmazonACES.xsd:191:2: error: sch-props-correct.2: Duplicate global element: DriveType (Original global element found in file: aces.xsd)
AmazonACES.xsd:200:2: error: sch-props-correct.2: Duplicate global element: EngineBase (Original global element found in file: aces.xsd)
AmazonACES.xsd:209:2: error: sch-props-correct.2: Duplicate global element: EngineDesignation (Original global element found in file: aces.xsd)
AmazonACES.xsd:218:2: error: sch-props-correct.2: Duplicate global element: EngineMfr (Original global element found in file: aces.xsd)
AmazonACES.xsd:227:2: error: sch-props-correct.2: Duplicate global element: EngineVIN (Original global element found in file: aces.xsd)
AmazonACES.xsd:236:2: error: sch-props-correct.2: Duplicate global element: EngineVersion (Original global element found in file: aces.xsd)
AmazonACES.xsd:252:2: error: sch-props-correct.2: Duplicate global element: FrontBrakeType (Original global element found in file: aces.xsd)
AmazonACES.xsd:261:2: error: sch-props-correct.2: Duplicate global element: FrontSpringType (Original global element found in file: aces.xsd)
AmazonACES.xsd:270:2: error: sch-props-correct.2: Duplicate global element: FuelDeliverySubType (Original global element found in file: aces.xsd)
AmazonACES.xsd:279:2: error: sch-props-correct.2: Duplicate global element: FuelDeliveryType (Original global element found in file: aces.xsd)
AmazonACES.xsd:288:2: error: sch-props-correct.2: Duplicate global element: FuelSystemControlType (Original global element found in file: aces.xsd)
AmazonACES.xsd:297:2: error: sch-props-correct.2: Duplicate global element: FuelSystemDesign (Original global element found in file: aces.xsd)
AmazonACES.xsd:306:2: error: sch-props-correct.2: Duplicate global element: FuelType (Original global element found in file: aces.xsd)
AmazonACES.xsd:323:2: error: sch-props-correct.2: Duplicate global element: IgnitionSystemType (Original global element found in file: aces.xsd)
AmazonACES.xsd:332:2: error: sch-props-correct.2: Duplicate global element: Make (Original global element found in file: aces.xsd)
AmazonACES.xsd:341:2: error: sch-props-correct.2: Duplicate global element: MfrBodyCode (Original global element found in file: aces.xsd)
AmazonACES.xsd:351:2: error: sch-props-correct.2: Duplicate global element: MfrLabel (Original global element found in file: aces.xsd)
AmazonACES.xsd:360:2: error: sch-props-correct.2: Duplicate global element: Model (Original global element found in file: aces.xsd)
AmazonACES.xsd:369:2: error: sch-props-correct.2: Duplicate global element: Note (Original global element found in file: aces.xsd)
AmazonACES.xsd:387:2: error: sch-props-correct.2: Duplicate global element: Part (Original global element found in file: aces.xsd)
AmazonACES.xsd:396:2: error: sch-props-correct.2: Duplicate global element: PartType (Original global element found in file: aces.xsd)
AmazonACES.xsd:405:2: error: sch-props-correct.2: Duplicate global element: Position (Original global element found in file: aces.xsd)
AmazonACES.xsd:414:2: error: sch-props-correct.2: Duplicate global element: Qty (Original global element found in file: aces.xsd)
AmazonACES.xsd:415:2: error: sch-props-correct.2: Duplicate global element: RearBrakeType (Original global element found in file: aces.xsd)
AmazonACES.xsd:424:2: error: sch-props-correct.2: Duplicate global element: RearSpringType (Original global element found in file: aces.xsd)
AmazonACES.xsd:433:2: error: sch-props-correct.2: Duplicate global element: Region (Original global element found in file: aces.xsd)
AmazonACES.xsd:451:2: error: sch-props-correct.2: Duplicate global element: SteeringSystem (Original global element found in file: aces.xsd)
AmazonACES.xsd:460:2: error: sch-props-correct.2: Duplicate global element: SteeringType (Original global element found in file: aces.xsd)
AmazonACES.xsd:469:2: error: sch-props-correct.2: Duplicate global element: SubModel (Original global element found in file: aces.xsd)
AmazonACES.xsd:508:2: error: sch-props-correct.2: Duplicate global element: TransmissionBase (Original global element found in file: aces.xsd)
AmazonACES.xsd:517:2: error: sch-props-correct.2: Duplicate global element: TransmissionControlType (Original global element found in file: aces.xsd)
AmazonACES.xsd:526:2: error: sch-props-correct.2: Duplicate global element: TransmissionMfr (Original global element found in file: aces.xsd)
AmazonACES.xsd:535:2: error: sch-props-correct.2: Duplicate global element: TransmissionMfrCode (Original global element found in file: aces.xsd)
AmazonACES.xsd:544:2: error: sch-props-correct.2: Duplicate global element: TransmissionNumSpeeds (Original global element found in file: aces.xsd)
AmazonACES.xsd:553:2: error: sch-props-correct.2: Duplicate global element: TransmissionType (Original global element found in file: aces.xsd)
AmazonACES.xsd:562:2: error: sch-props-correct.2: Duplicate global element: VehicleType (Original global element found in file: aces.xsd)
AmazonACES.xsd:571:2: error: sch-props-correct.2: Duplicate global element: WheelBase (Original global element found in file: aces.xsd)
AmazonACES.xsd:580:2: error: sch-props-correct.2: Duplicate global element: Years (Original global element found in file: aces.xsd)
PIES_5.0_02_01_2006.xsd:4548:2: error: sch-props-correct.2: Duplicate global type: MaintenanceType (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:4591:2: error: sch-props-correct.2: Duplicate global type: ImageStyle (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4664:2: error: sch-props-correct.2: Duplicate global type: FileType (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4706:2: error: sch-props-correct.2: Duplicate global type: ImageResolution (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:4756:2: error: sch-props-correct.2: Duplicate global type: ImageRepresentation (Original global type found in file: AmazonPIES
.xsd)
PIES_5.0_02_01_2006.xsd:4799:2: error: sch-props-correct.2: Duplicate global type: ColorMode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4846:2: error: sch-props-correct.2: Duplicate global type: Background (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:4894:2: error: sch-props-correct.2: Duplicate global type: OrientationView (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:4977:2: error: sch-props-correct.2: Duplicate global type: ImageFileEncodeType (Original global type found in file: AmazonPIES
.xsd)
PIES_5.0_02_01_2006.xsd:5065:2: error: sch-props-correct.2: Duplicate global type: LanguageCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5113:2: error: sch-props-correct.2: Duplicate global type: LinkCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5215:2: error: sch-props-correct.2: Duplicate global type: ItemIDQualifier (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:5270:2: error: sch-props-correct.2: Duplicate global type: KitsUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5384:2: error: sch-props-correct.2: Duplicate global type: PackageUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5432:2: error: sch-props-correct.2: Duplicate global type: PackageDimUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5475:2: error: sch-props-correct.2: Duplicate global type: ShippingScope (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5518:2: error: sch-props-correct.2: Duplicate global type: Bulk (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5561:2: error: sch-props-correct.2: Duplicate global type: WeightUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:5604:2: error: sch-props-correct.2: Duplicate global type: CountryCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6121:2: error: sch-props-correct.2: Duplicate global type: TransportMethod (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:6168:2: error: sch-props-correct.2: Duplicate global type: Regulated (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6212:2: error: sch-props-correct.2: Duplicate global type: PackagingGroupCode (Original global type found in file: AmazonPIES.
xsd)
PIES_5.0_02_01_2006.xsd:6258:2: error: sch-props-correct.2: Duplicate global type: ExtendedProductInformationCode (Original global type found in file:
 AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6417:2: error: sch-props-correct.2: Duplicate global type: RegulationsExceptionCode (Original global type found in file: Amazo
nPIES.xsd)
PIES_5.0_02_01_2006.xsd:6466:2: error: sch-props-correct.2: Duplicate global type: PriceBreakUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6545:2: error: sch-props-correct.2: Duplicate global type: PriceUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6681:2: error: sch-props-correct.2: Duplicate global type: DescriptionCode (Original global type found in file: AmazonPIES.xsd
)
PIES_5.0_02_01_2006.xsd:6748:2: error: sch-props-correct.2: Duplicate global type: PriceType (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6865:2: error: sch-props-correct.2: Duplicate global type: OQUOM (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:6974:2: error: sch-props-correct.2: Duplicate global type: GTINQualifier (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:7025:2: error: sch-props-correct.2: Duplicate global type: HazardousMaterialCode (Original global type found in file: AmazonPI
ES.xsd)
PIES_5.0_02_01_2006.xsd:7070:2: error: sch-props-correct.2: Duplicate global type: StateCode (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:7247:2: error: sch-props-correct.2: Duplicate global type: ContactType (Original global type found in file: AmazonPIES.xsd)
PIES_5.0_02_01_2006.xsd:7290:2: error: sch-props-correct.2: Duplicate global type: QualityGradeLevel (Original global type found in file: AmazonPIES.x
sd)
PIES_5.0_02_01_2006.xsd:13:2: error: sch-props-correct.2: Duplicate global element: PartInformation (Original global element found in file: AmazonPIES
.xsd)
TypeDefinitions.xsd:36:2: error: sch-props-correct.2: Duplicate global type: CurrencyCode (Original global type found in file: PIES_5.0_02_01_2006.xsd
)
Time to build schema type system: 3.525 seconds
BUILD FAILED

残念ながら、XSD ファイルはすべて機密としてマークされているため、ここでその内容を共有することはできません。そうは言っても、予感、提案、または方向性さえあれば、共有してください。

4

1 に答える 1

1

セットアップの正確な詳細がわからないため、これが答えである場合とそうでない場合がありますが、問題がこれを強く思い出させたので、役立つと思います. これは、XJC を使用する JAXB のみに適用されることに注意してください。ただし、この問題の原因は、実際には Apache Xerces および/または同等の JRE のバグである可能性があるため、バインディング フレームワークの選択によって違いが生じない可能性があります。JRE Xerces フォークと最新の Xerces リリースの両方で問題が発生したため、XML API 実装を切り替えても何も起こりませんでした。

メインスキーマ、メインスキーマに含まれる他のスキーマ(同じ名前空間)、およびバインディングファイルを非常に単純に含む1つのMavenプロジェクトがあります。次に、他にもいくつかの Maven プロジェクトがあり、それぞれがメインのプロジェクト (異なる名前空間) をインポートする独自のスキーマを持っています。メイン スキーマとそのインクルードの JAXB エンティティは最初の Maven プロジェクトによって既に生成されているため、エピソード ファイルを使用して、コードを再生成するのではなく、他のプロジェクトが単純に拡張するようにしたいと考えました。これにより、個別の jar を配布できます。

最初のメイン プロジェクトの Maven pom (Maven 3) は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>acme.xml</groupId>
    <artifactId>acme-xml-main</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>Acme XML main models</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <outputDirectory>${basedir}/target/classes-${compilerTarget}</outputDirectory>
        <testOutputDirectory>${basedir}/target/test-classes-${compilerTarget}</testOutputDirectory>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <excludes>
                    <!-- Filtering out any svn folders -->
                    <exclude>**/.svn</exclude>
                    <!-- Filtering out JAXB binding files -->
                    <exclude>**/*.xjb</exclude>
                    <!-- Filtering out XML catalogs -->
                    <exclude>**/*.cat</exclude>
                </excludes>
            </resource>
        </resources>
        <!-- First we need to generate Java source files based on the schemas -->
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb21-plugin</artifactId>
                <version>0.8.0</version>
                <executions>
                    <execution>
                        <id>xjc-generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <schemaDirectory>${basedir}/src/main/resources/acme/schemas</schemaDirectory>
                            <schemaLanguage>XMLSCHEMA</schemaLanguage>
                            <addCompileSourceRoot>true</addCompileSourceRoot>
                            <episode>true</episode>
                            <removeOldOutput>true</removeOldOutput>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <target>1.6</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <optimize>true</optimize>
                 <source>1.6</source>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
            </plugin>
        </plugins>
    </build>
</project>

スキーマは、XJC で生成されたクラスと一緒にパッケージ化されています。このプロジェクト (より具体的には、その jar) を、それを「拡張」する他のプロジェクトで参照したいと考えています。

そのような拡張機能の Maven pom は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>acme.xml</groupId>
    <artifactId>acme-xml-sub</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>Acme XML sub models</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>acme.xml</groupId>
            <artifactId>acme-xml-main</artifactId>
            <version>1.0.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <outputDirectory>${basedir}/target/classes-${compilerTarget}</outputDirectory>
        <testOutputDirectory>${basedir}/target/test-classes-${compilerTarget}</testOutputDirectory>
        <!-- Resources to include into the packaged build -->
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <excludes>
                    <!-- Filtering out any svn folders -->
                    <exclude>**/.svn</exclude>
                    <!-- Filtering out JAXB binding files -->
                    <exclude>**/*.xjb</exclude>
                    <!-- Filtering out XML catalogs -->
                    <exclude>**/*.cat</exclude>
                </excludes>
            </resource>
        </resources>
        <plugins>
            <!-- First we need to generate Java source files based on the schemas -->
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb21-plugin</artifactId>
                <version>0.8.2</version>
                <executions>
                    <execution>
                        <id>xjc-generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <!-- The extension flag needs to be on in order to use the episode file -->
                            <args>
                                <arg>-extension</arg>
                            </args>
                            <schemaDirectory>${basedir}/src/main/resources/acme/sub/schemas</schemaDirectory>
                            <schemaLanguage>XMLSCHEMA</schemaLanguage>
                            <addCompileSourceRoot>true</addCompileSourceRoot>
                            <!-- No need to generate an episode for this compilation... -->
                            <episode>false</episode>
                            <!-- The catalog makes sure we can resolve the main schema -->
                            <catalog>${basedir}/src/main/resources/acme/sub/schemas/catalog.cat</catalog>
                            <!-- Using the episode file from the main model jar -->
                            <episodes>
                                <episode>
                                    <groupId>acme.xml</groupId>
                                    <artifactId>acme-xml-main</artifactId>
                                    <version>1.0.0</version>
                                    <scope>compile</scope>
                                </episode>
                            </episodes>
                            <removeOldOutput>true</removeOldOutput>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <target>1.6</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <optimize>true</optimize>
                    <excludes>
                        <!-- This exclude avoids compiling the ObjectFactory class that -->
                        <!-- XJC insists on generating for the default package name of the main -->
                        <!-- namespace. Please leave this in to avoid any trouble. -->
                        <exclude>**/acme/main/ObjectFactory.java</exclude>
                    </excludes>
                 <source>1.6</source>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
            </plugin>
        </plugins>
    </build>
</project>

最初に遭遇した問題は、サブ スキーマにインポートするためのメイン スキーマが見つからないことでした。メイン スキーマ を呼び出しましょうmain.xsd。ターゲット名前空間がhttp://www.acme.comあり、その JAXB クラスがacme.mainバインディング ファイルのおかげでパッケージに配置されているとします。

スキーマを解決するには、カタログを使用できます。それで、これは私が最初に試したことでした。サブ プロジェクトでは、次の内容の catalog.cat ファイルを追加しました。

--
  Resolving the main XML Schema system ID.
--
SYSTEM "main.xsd" "classpath:/acme/schemas/main.xsd"

--
  Resolving the main namespace to the corresponding schema file.
--
PUBLIC "http://www.acme.com" "classpath:/acme/schemas/main.xsd"

上記の 2 番目の Maven pom で参照されている catalog.cat を確認できます。SYSTEM ID に対してさまざまなアプローチを試してみましたが、何をしたかに関係なく、クラスパス上のスキーマを解決することはうまくいかなかったようです。そこで、これを処理するカスタム カタログ リゾルバーを作成することにしました。これは、メイン スキーマ/JAXB モデルの jar ファイルと一緒にパッケージ化した Java クラスです。この依存関係を最初の Maven pom に追加しました...

<dependency>
    <groupId>com.sun.org.apache.xml.internal</groupId>
    <artifactId>resolver</artifactId>
    <version>20050927</version>
    <scope>provided</scope>
</dependency>

...そして、特定のシステム ID とメイン名前空間 URI をメイン スキーマに常にリンクするカスタム カタログ リゾルバーを作成しました。

次に、2 番目の Maven pom の XJC 生成構成を次のように調整しました。

<!-- First we need to generate Java source files based on the schemas -->
<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb21-plugin</artifactId>
    <version>0.8.2</version>
    <!-- Need this dependency for the custom catalog resolver -->
    <dependencies>
        <dependency>
            <groupId>acme.xml</groupId>
            <artifactId>acme-xml-main</artifactId>
            <version>1.0.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>xjc-generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <!-- The extension flag needs to be on in order to use the episode file -->
                <args>
                    <arg>-extension</arg>
                </args>
                <schemaDirectory>${basedir}/src/main/resources/acme/sub/schemas</schemaDirectory>
                <schemaLanguage>XMLSCHEMA</schemaLanguage>
                <addCompileSourceRoot>true</addCompileSourceRoot>
                <!-- No need to generate an episode for this compilation... -->
                <episode>false</episode>
                <!-- The catalog makes sure we can resolve the main schema -->
                <catalog>${basedir}/src/main/resources/acme/sub/schemas/catalog.cat</catalog>
                <catalogResolver>acme.xml.tools.AcmeCatalogResolver</catalogResolver>
                <!-- Using the episode file from the general model bundle -->
                <episodes>
                    <episode>
                        <groupId>acme.xml</groupId>
                        <artifactId>acme-xml-main</artifactId>
                        <version>1.0.0</version>
                        <scope>compile</scope>
                    </episode>
                </episodes>
                <removeOldOutput>true</removeOldOutput>
            </configuration>
        </execution>
    </executions>
</plugin>

これと、何が起こっているのかを調べるためのカタログ リゾルバからのコンソール出力により、メイン スキーマを最終的にクラスパスから解決できました。しかし、準備はまだ整っていませんでした。

メイン スキーマでインクルードを使用するたびに、わかりやすくするためにさまざまなファイルやグループ定義に分割できることを確認すると、XML プロセッサが定義の重複を訴えることがありました。さまざまなファイルが異なるパス (システム ID、名前空間、完全パス、相対パスなど) を介して解決されるように見え、これが問題を引き起こしているようです。これらのさまざまなパスは本質的に同じファイルを指していましたが、そこからロードされたものはすべて、XML プロセッサによって個別の定義と見なされます。XML 検証 API は、1 つの一貫したスキーマ オブジェクトを作成するのが得意ではなく、さまざまなパスを介して同じファイルを参照していることに気付かずに、検索を続けているようです。

そのため、カスタム カタログ リゾルバーにさらに多くのものを追加して、インクルード ファイルが常に同じ方法で処理されるようにしました。結果のクラスは次のとおりです。

package acme.xml.tools;

import com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver;
import java.io.InputStream;
import java.net.URL;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import org.xml.sax.InputSource;

public class AcmeCatalogResolver extends CatalogResolver {

    private final static String namespace = "http://www.acme.com";
    private final static Set<String> systemIDs;
    static {
        final Set<String> temp = new HashSet<String>();
        temp.add("main.xsd");
        temp.add("Main.xsd");
        temp.add("MAIN.xsd");
        systemIDs = Collections.unmodifiableSet(temp);
    }

    @Override
    public InputSource resolveEntity(String publicId, String systemId) {

        //If the public ID is the main namespace, get the input source
        //based on the system ID
        if(publicId != null && publicId.trim().equals(namespace)) {
            final InputSource source = getInputSource(systemId);
            source.setPublicId(publicId);
            return source;
        }

        //Otherwise, check if the system ID is one of the allowed references
        //to the main schema and return that
        if(systemId != null && systemIDs.contains(systemId.trim())) {
            final InputSource source = getMainSchemaInputSource();
            source.setPublicId(publicId);
            return source;
        }

        //Still nothing: check for file or jar URIs to the main schema
        if(systemId != null && (systemId.startsWith("file:") || 
                systemId.startsWith("jar:"))) {
            boolean match = false;
            for(final String id : systemIDs) {
                match = systemId.endsWith(id);
                if(match)
                    break;
            }
            if(match) {
                final InputSource source = getMainSchemaInputSource();
                source.setPublicId(publicId);
                return source;
            }
        }

        //Final option: use only the system ID to find the source
        if(systemId != null && !systemId.isEmpty()) {
            final InputSource source = getInputSource(systemId);
            source.setPublicId(publicId);
            return source;
        }

        //This should not be necessary, but just in case...
        return super.resolveEntity(publicId, systemId);

    }

    @Override
    public Source resolve(String href, String base) throws TransformerException {

        if(href != null && href.trim().equals(namespace)) {
            final StreamSource source = getMainSchemaSource();
            source.setPublicId(href);
            return getMainSchemaSource();
        }

        return super.resolve(href, base);

    }

    @Override
    public String getResolvedEntity(String string, String string1) {

        return super.getResolvedEntity(string, string1);

    }

    private InputSource getInputSource(String systemId) {

        final int lastSlash = systemId.lastIndexOf('/');
        if(lastSlash >= 0)
            systemId = systemId.substring(lastSlash + 1);
        final int lastBackSlash = systemId.lastIndexOf('\\');
        if(lastBackSlash >= 0)
            systemId = systemId.substring(lastBackSlash + 1);

        final URL url = 
            this.getClass().getResource("/acme/schemas/" + systemId);

        final InputStream stream = 
            this.getClass().getResourceAsStream("/acme/schemas/" + systemId);

        final InputSource source = new InputSource(stream);
        source.setSystemId(url.toString());

        return source;

    }

    private InputSource getMainSchemaInputSource() {

        final URL url = 
            this.getClass().getResource("/acme/schemas/main.xsd");

        final InputStream stream = 
            this.getClass().getResourceAsStream("/acme/schemas/main.xsd");

        final InputSource source = new InputSource(stream);
        source.setSystemId(url.toString());

        return source;

    }

    private StreamSource getGeneralSchemaSource() {

        final URL url = 
            this.getClass().getResource("/acme/schemas/main.xsd");

        final InputStream stream = 
            this.getClass().getResourceAsStream("/acme/schemas/main.xsd");

        final StreamSource source = new StreamSource(stream);
        source.setSystemId(url.toString());

        return source;

    }

}

それで、私はついにそれを機能させました。これが何らかの形で解決への道を啓発することを願っています。

ええ、めちゃくちゃ汚いです。Sun 内部クラスを拡張しています。私は基本的に、カタログ ファイルを使用して、メイン スキーマまたはその名前空間の要求を、取引全体をハードコーディングするハッキーなクラスに転送しています。しかし、少なくともこのように機能します。どうやら Sun は、何年にもわたって公開されてきた JAXP 実装の問題を解決することに熱心ではなかったようです。そして、オラクルも空飛ぶがらくたを与えるとは思いません。しかし、マザーボードから踏み出すようなプログラムとのやり取りについては、彼らが XML をあなたの喉に押し付けようとすることを確信してください。また、Apache の Xerces 実装も、この問題を解決していません。W3C XML Schema 仕様の災難を考えると、彼らを本当に責めることはできません。

最後に申し訳ありませんが、Java で XML スキーマを使用して些細なこと以外のことを行うと、すぐに精神的苦痛に変わることが判明したときに、時々発散する必要があります。JAXB がそれほど有用でない場合、私はこれを気にしません。

于 2013-01-21T15:17:30.813 に答える