jaxb / Maven에 여러 스키마 패키지를 생성하도록 어떻게 알릴 수 있습니까?


80

예:

</plugin>       
       <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir1</schemaDirectory>
              <schemaIncludes>
                  <include>schema1.xsd</include>
              </schemaIncludes>
              <generatePackage>schema1.package</generatePackage>
           </configuration>
         </plugin>
          <plugin>
           <groupId>org.jvnet.jaxb2.maven2</groupId>
           <artifactId>maven-jaxb2-plugin</artifactId>
           <version>0.7.1</version>
           <executions>
             <execution>
               <goals>
                 <goal>generate</goal>
               </goals>
             </execution>
           </executions>
            <configuration>
             <schemaDirectory>src/main/resources/dir2</schemaDirectory>
              <schemaIncludes>
                  <include>schema2.xsd</include>
              </schemaIncludes>
              <generatePackage>schema2.package</generatePackage>
           </configuration>
         </plugin>
       </plugins>

무슨 일이 있었는지 : Maven이 첫 번째 플러그인을 실행합니다. 그런 다음 대상 폴더를 삭제하고 표시되는 두 번째 패키지를 만듭니다.

첫 번째 구성에는 target / somedir1을, 두 번째 구성에는 target / somedir2를 설정하려고했습니다. 그러나 행동은 변하지 않습니까? 어떤 아이디어? src / main / java 폴더에 직접 패키지를 생성하고 싶지 않습니다. 이러한 패키지는 생성되고 수동으로 생성 된 클래스와 혼합되어서는 안되기 때문입니다.


네, Pascal의 솔루션이 거의 완벽하게 작동하지만 동일한 문제가 있습니다. 이제 필요한 것은 IDE가 생성 된 코드로 잘 작동하도록하는 것입니다. 그렇지 않으면 내가 원하는 것입니다.
Newtopian

답변:


119

나는 다르게 지정해야했다 generateDirectory(이없이 플러그인은 파일이 최신 상태이며 두 번째 실행 중에 아무것도 생성하지 않는 것으로 간주했습니다). 그리고 target/generated-sources/<tool>생성 된 소스에 대한 규칙 을 따르는 것이 좋습니다 . 그러면 자주 사용하는 IDE에서 자동으로 가져올 수 있습니다. 또한 execution플러그인을 두 번 선언하는 대신 여러 개를 선언하는 것이 좋습니다 (그리고 configurationexecution요소 내부 로 이동 ).

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>schema1-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>shiporder.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package1</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc1</generateDirectory>
      </configuration>
    </execution>
    <execution>
      <id>schema2-generate</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>books.xsd</include>
        </schemaIncludes>
        <generatePackage>com.stackoverflow.package2</generatePackage>
        <generateDirectory>${project.build.directory}/generated-sources/xjc2</generateDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

이 설정을 사용하면 다음과 같은 결과를 얻습니다. mvn clean compile

$ 트리 타겟 /
표적/
├── 수업
│ ├── com
│ │ └── 스택 오버플로
│ │ ├── App.class
│ │ ├── 패키지 1
│ │ │ ├── ObjectFactory.class
│ │ │ ├── Shiporder.class
│ │ │ ├── Shiporder $ Item.class
│ │ │ └── Shiporder $ Shipto.class
│ │ └── 패키지 2
│ │ ├── BookForm.class
│ │ ├── BooksForm.class
│ │ ├── ObjectFactory.class
│ │ └── package-info.class
│ ├── dir1
│ │ └── shiporder.xsd
│ └── dir2
│ └── books.xsd
└── 생성 된 소스
    ├── xjc
    │ └── META-INF
    │ └── sun-jaxb.episode
    ├── xjc1
    │ └── com
    │ └── 스택 오버플로
    │ └── 패키지 1
    │ ├── ObjectFactory.java
    │ └── Shiporder.java
    └── xjc2
        └── com
            └── 스택 오버 플로우
                └── 패키지 2
                    ├── BookForm.java
                    ├── BooksForm.java
                    ├── ObjectFactory.java
                    └── package-info.java

예상되는 결과 인 것 같습니다.


고마워요, 사실 어제 같은 문제가 있었는데 잠시만 요. 귀하의 솔루션은 거의 완벽하게 작동합니다. 이제 유일한 문제는 Eclipse를 오류없이 컴파일 할 수 없다는 것입니다. 하지만 명령 줄에서는 모두 좋습니다. 현재 해결 방법은이 폴더를 대상 폴더에 소스 폴더로 선언하는 것입니다. 모든 것이 좋습니다. 내가 그다지 마음에 들지는 않지만 생성 된 코드로 jar를 만들고 직접 사용하는 것이
좋습니다.

1
eclipse 플러그인 m2eclipse는 빌드 경로를 업데이트합니다. mvc clean assembly : assembly로 빈을 생성 한 후 [프로젝트 오른쪽 클릭]> [Maven]> [프로젝트 구성 업데이트]를 실행하면 빌드 경로가 업데이트됩니다.
MR

@Newtopian @MR의 의견을 참조하십시오. m2eclipse는 제가 언급 한 규칙을 따르면 그렇게 할 것입니다.
Pascal Thivent

흠 좋아, 내가 수동으로했던 것과 똑같은 일을하는 것이 밝혀졌다. 지금은 단지 한두 번의 클릭 만하면된다. 소스 폴더에서 대상을 보는 것이 여전히 이상하지만 이제 거의 무료이므로 유지하겠습니다. :-)
Newtopian

1
나는 그것이 오래된 질문이라는 것을 알고 있지만 뭔가 대답하기를 바랍니다. 나는 그 코드를 사용하고 작동합니다. 그러나 동일한 패키지를 설정하려면 항상 하나의 스키마 만 생성합니다. 예를 들어 첫 번째 실행에서는 com.myproject.answer를 설정하고 두 번째 실행에서는 com.myproject.request ..를 설정하고 소스 생성 후에는 * answer 패키지 만 있고 요청이 누락되었습니다. 어떻게 해결할 수 있는지 알 수 있습니까? 내가 설정 한 디렉토리도 동일하게 생성하십시오.
Denis Stephanov

14

JAXB 바인딩을 사용하여 각 스키마에 대해 다른 패키지를 지정할 수도 있습니다.

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" schemaLocation="book.xsd">

    <jaxb:globalBindings>
        <xjc:serializable uid="1" />
    </jaxb:globalBindings>

    <jaxb:schemaBindings>
        <jaxb:package name="com.stackoverflow.book" />
    </jaxb:schemaBindings>

</jaxb:bindings>

그런 다음 새로운 받는다는-JAXB2 - 플러그인 0.8.0 사용 <schemas>하고 <bindings>요소를 pom.xml. 또는의 최상위 디렉토리를 지정 <schemaDirectory>하고 <bindingDirectory>의해 <include>귀하의 스키마 및 바인딩 :

<schemaDirectory>src/main/resources/xsd</schemaDirectory>
<schemaIncludes>
    <include>book/*.xsd</include>
    <include>person/*.xsd</include>
</schemaIncludes>
<bindingDirectory>src/main/resources</bindingDirectory>
<bindingIncludes>
    <include>book/*.xjb</include>
    <include>person/*.xjb</include>
</bindingIncludes>

새로운 XSD를 추가 할 때 Maven을 변경할 필요가 없기 때문에 이것이 더 편리한 솔루션 이라고 생각합니다 pom.xml. 동일한 디렉토리에 새로운 XJB 바인딩 파일을 추가하기 만하면됩니다.


구문 강조 힌트를 제공하는 사소한 편집은 게시물의 가독성을 향상시킵니다.
Kev

좋습니다. 설명해 주셔서 감사합니다. 편집 추가 구문 강조를 얻지 못했습니다.
xmedeko

2
새 스키마가 추가 될 때마다 pom을 계속 변경하고 싶지 않기 때문에 이것은 저에게 가장 좋은 대답입니다.
Ben Thurley 2013-08-30

여기서 한 가지 문제는 책과 사람이 xsd의 동일한 대상 네임 스페이스에있는 경우입니다. 대신에 그들이 모두 publishable.xsd를 포함하는 책, 저널, 신문 등을 가지고 있다고 가정 해 봅시다. 둘은 게시 가능한 것과 동일한 네임 스페이스에 있어야하며 따라서 서로간에 있어야합니다. 이제 네임 스페이스 당 하나의 schemaBindings 만 가질 수 있으므로이 문제가 해결됩니다. 나는 그것이 이상적이라는 데 동의하고 위의 예에서 효과가 있었으면 좋겠지 만 JAXB는 충분히 유연하지 않습니다.
TurnipEntropy

8

플러그인을 한 번만 정의하고 실행 영역을 두 번 수행하도록 변경해야합니다. 다음과 같이 ... 그리고 generateDirectory를 설정해야합니다 (문서 기반) ..

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <version>0.7.1</version>
  <executions>
    <execution>
      <id>firstrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen1</generateDirectory>
        <schemaDirectory>src/main/resources/dir1</schemaDirectory>
        <schemaIncludes>
          <include>schema1.xsd</include>
        </schemaIncludes>
        <generatePackage>schema1.package</generatePackage>
      </configuration>
    </execution>
    <execution>
      <id>secondrun</id>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <generateDirectory>target/gen2</generateDirectory>
        <schemaDirectory>src/main/resources/dir2</schemaDirectory>
        <schemaIncludes>
          <include>schema2.xsd</include>
        </schemaIncludes>
        <generatePackage>schema2.package</generatePackage>
      </configuration>
    </execution>
  </executions>
</plugin>

당신은 메이븐의 단일 인공물 규칙에 맞서 싸우는 것 같았습니다 ... 이것에 대해 생각해야 할 수도 있습니다.


모듈 당 하나의 아티팩트 규칙은 사실이지만 ... OP는 두 개의 아티팩트를 생성하지 않습니다.
Pascal Thivent

5

스키마에 대해 오래된 파일 이름을 지정하고 출력 디렉토리를 지우지 않음으로써이를 수행 할 수도 있습니다. 기본 출력 디렉토리는 거의 편리하지 않은 클래스 경로에 자동으로 포함됩니다. 다른 출력 디렉토리를 지정하는 경우 IDE에서이 코드를 사용하려면 클래스 경로를 관리해야합니다. 예를 들면-

<plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.3.1</version>
            <configuration>
                <quiet>true</quiet>
                <verbose>false</verbose>
                <clearOutputDir>false</clearOutputDir>
                <readOnly>true</readOnly>
                <arguments>-mark-generated</arguments>
            </configuration>
            <executions>
                <execution>
                    <id>reportingSchema</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaReporting</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaReporting.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.reporting</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-reporting</staleFile>
                    </configuration>
                </execution>
                <execution>
                    <id>schemaAS</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <schemaDirectory>src/main/resources/schema/r17/schemaAS</schemaDirectory>
                        <schemaIncludes>
                            <include>OCISchemaAS.xsd</include>
                        </schemaIncludes>
                        <packageName>com.broadsoft.oci.r17.as</packageName>
                        <staleFile>${build.directory}/generated-sources/.jaxb-staleFlag-as</staleFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
</plugins>

출처 : JAXB 플러그인으로 코드 생성


5

나는 다음으로 해결했습니다.

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                        <forceRegenerate>true</forceRegenerate>

이것을 각 구성에 추가하십시오.)


2
<executions>태그 에만 추가 할 수도 있습니다 . 충분합니다. <removeOldOutput>기본적으로 false로 설정됩니다. 하지만 난 찾을 수 <clearOutputDir>static.highsource.org/mjiip/maven-jaxb2-plugin/...

나에게 진정한 해결책은 당신이 같은 폴더에 everythong을 생성 할 수 있기 때문입니다
MilacH

<clearOutputDir>false</clearOutputDir>제 경우에는 충분했습니다.
Ruwanka Madhushan

3

이것은 플러그인의 버전 1.6에서 수정되었습니다 .

            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>

그러나 첫 번째 반복 출력이 삭제되고 있음을 알았습니다. 각 실행에 다음을 추가하여 수정했습니다.

                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>

다음은 각 반복이 올바르게 출력되는 전체 작업 예제입니다. BTW 나는 xsd의 중복 네임 스페이스 문제로 인해 이것을해야했습니다. 이것은 내 문제를 해결하는 것 같습니다.

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>submitOrderRequest</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderRequest.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderRequest.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
                <execution>
                    <id>submitOrderResponse</id>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <schemaDirectory>src/main/resources/xsd/</schemaDirectory>
                        <!-- <schemaFiles>getOrderStatusResponse.xsd,quoteShippingRequest.xsd,quoteShippingResponse.xsd,submitOrderRequest.xsd,submitOrderResponse.xsd</schemaFiles> -->
                        <schemaFiles>submitOrderResponse.xsd</schemaFiles>
                        <bindingDirectory>${project.basedir}/src/main/resources/xjb</bindingDirectory>
                        <bindingFiles>submitOrderResponse.xjb</bindingFiles>
                        <removeOldOutput>false</removeOldOutput>
                        <clearOutputDir>false</clearOutputDir>
                    </configuration>
                </execution>
            </executions>

        </plugin>

2

다음은 많은 시도 끝에 나를 위해 작동합니다.

<plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>jaxb2-maven-plugin</artifactId>
         <version>2.1</version>
         <executions>
            <execution>
              <id>xjc1</id>
              <goals>
                  <goal>xjc</goal>
              </goals>
             <configuration>
                <packageName>com.mycompany.clientSummary</packageName>
               <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetClientSummary.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                 <clearOutputDir>false</clearOutputDir>
            </configuration>
          </execution>

          <execution>
             <id>xjc2</id>
             <goals>
                 <goal>xjc</goal>
             </goals>
             <configuration>
                <packageName>com.mycompany.wsclient.employerProfile</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetEmployerProfile.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
         </configuration>
         </execution>

         <execution>
            <id>xjc3</id>
            <goals>
                <goal>xjc</goal>
            </goals>
            <configuration>
                <packageName>com.mycompany.wsclient.producersLicenseData</packageName>
                <sourceType>wsdl</sourceType>
                <sources>
                <source>src/main/resources/wsdl/GetProducersLicenseData.wsdl</source>
                </sources>
                <outputDirectory>target/generated-sources/xjb</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
            </configuration>
        </execution>


     </executions>
  </plugin>

2

Maven에서 jaxb를 사용할 때 많은 문제가 발생했지만 다음을 수행하여 문제를 해결할 수있었습니다.

먼저 schema.xjc 파일을 만듭니다.

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
    <jaxb:bindings schemaLocation="YOUR_URL?wsdl#types?schema1">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema1"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
    <jaxb:bindings schemaLocation="YOUR_URL??wsdl#types?schema2">
        <jaxb:schemaBindings>
            <jaxb:package name="your.package.name.schema2"/>
        </jaxb:schemaBindings>
    </jaxb:bindings>
</jaxb:bindings>

패키지 이름은 Java에서 예약 된 키워드를 포함하지 않는 한 원하는대로 지정할 수 있습니다.

다음으로 wsimport.bat 스크립트를 작성하여 선호하는 위치에서 패키지 및 코드를 생성해야합니다.

cd C:\YOUR\PATH\TO\PLACE\THE\PACKAGES
wsimport -keep -verbose -b "C:\YOUR\PATH\TO\schema.xjb" YOUR_URL?wsdl
pause

cd를 사용하지 않으려면 "C : \ YOUR \ PATH \ TO \ PLACE \ THE \ PACKAGES"에 wsimport.bat를 넣을 수 있습니다.

-keep -verbose없이 실행하면 패키지 만 생성하고 .java 파일은 생성하지 않습니다.

-b는 생성시 schema.xjc가 사용되는지 확인합니다.


0

이것에 대한 또 다른 명확한 해결책이 있습니다. "staleFile" 이라는 매개 변수가 있습니다.이 매개 변수 는 물건을 다시 생성하지 않기 위해 플래그로 사용합니다. 각 실행에서 간단히 변경하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.