在生成Jaxb类时,包被删除使用Maven和生成的maven包名称不正确

时间:2012-11-15 05:33:17

标签: java maven xsd jaxb jaxb2-maven-plugin

我尝试使用jaxb2-maven-plugin从XSD生成Jaxb类。

我能够在一个包中获取jaxb类,但我的其他包被删除了。这是什么原因?怎么过来这个?请你给个建议。

以下是我尝试的内容

<bulid>
    <pluginManagement>
    <plugins>
        <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>1.5</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>xjc</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <schemaDirectory>src/main/xsd</schemaDirectory>
            <outputDirectory>src/main/java</outputDirectory>
        </configuration>
        </plugin>
    </plugins>
    </pluginManagement>
    </bulid>

和xsd看起来像这样:

<?xml version="1.0" encoding="UTF-8"?><xsd:schema targetNamespace="com.test.jaxb.model" 
        xmlns:ns="com.test.jaxb.model" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="TestResults">
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="testSuites" type="Q1:TestSuiteRun"/>
        </xsd:sequence>
        <xsd:attribute name="testProject" type="xsd:string"/>
    </xsd:complexType>


    <xsd:complexType name="TestCaseRun">
        <xsd:complexContent>
            <xsd:extension base="Q1:TestRun">
                <xsd:sequence>
        <xsd:element name="result" type="Q1:Severity"/>
      <xsd:element maxOccurs="unbounded" minOccurs="0" name="variations" type="Q1:VariationRun">
                    </xsd:element>
                </xsd:sequence>
                <xsd:attribute name="variationCount" type="xsd:int"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    </xsd:schema>

我已经给了targetNamespace =“com.test.jaxb.model”但是在生成之后我只能看到包名下的jaxb类:model.jaxb.test.com ..

为什么包名称反转,为什么我的其他包被删除?

3 个答案:

答案 0 :(得分:10)

您的主要问题是您使用src/main/java作为<outputDirectory>。这有两个主要问题。

  1. 生成的源将位于正常情况下受版本控制的目录结构中。您将如何处理生成的来源?他们应该签入吗?您的VCS将发出信号,表明仍未找到新文件。
  2. 当您致电mvn clean时,生成的来源 将被删除。
  3. 您应该完全删除<outputDirectory>src/main/java</outputDirectory>并让maven和插件完成工作。

    如果删除这些行,您将生成源target/generated-sources,并且 将在compile阶段编译,我认为这是你想要的。


    关于反向包名称,我认为您应该将targetNamespace更改为:

    <xsd:schema targetNamespace="http://www.test.com/jaxb/model"
        ...
    

答案 1 :(得分:7)

问题解决了:

<bulid>
    <pluginManagement>
    <plugins>
        <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>1.5</version>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>xjc</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <schemaDirectory>src/main/xsd</schemaDirectory>
            <outputDirectory>src/main/java</outputDirectory>
            <packageName>com.test.jaxb.model</packageName>
            <clearOutputDir>false</clearOutputDir>
        </configuration>
        </plugin>
    </plugins>
    </pluginManagement>
    </bulid>

我从xsd

中删除了targetNameSpace

mvn jaxb2:xjc工作!!

答案 2 :(得分:2)

在配置标记下添加以下属性。

<clearOutputDir>false</clearOutputDir>