2014-01-14 5 views
3

Я хотел бы сгенерировать схему jaxb xsd из файлов классов в jar. В настоящее время я использую jaxb2-maven-plugin для создания схемы с использованием java-файлов.Создать jaxb Xsd-схему для файлов классов из jar

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>jaxb2-maven-plugin</artifactId> 
     <version>${maven.plugin.jaxb2}</version> 
     <executions> 
      <execution> 
       <id>schemagen</id> 
       <goals> 
       <goal>schemagen</goal> 
       </goals> 
       <phase>process-classes</phase> 
       <configuration> 
       <quiet>true</quiet> 
       <includes> 
        <include>com/someProject/domain/*.java</include> 
       </includes> 
       <outputDirectory>${project.build.directory}/schemas</outputDirectory> 
       <clearOutputDir>true</clearOutputDir> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

Но, у меня есть случай, когда использование я получаю опарник зависимостей и хотел бы, чтобы произвести из некоторых классов из этого файла JAR. Может ли кто-нибудь предложить, как это можно сделать.

+0

У меня есть статья, которая делает именно противоположное тому, что вы просили - http://javareferencegv.blogspot.com/2013/10/generating-jar-file-from -xsd-using-ant.html Наблюдая этот вопрос за ответы, хотя –

+0

напротив :) У вас есть мысли о том, как это можно сделать? –

+0

Я чувствую, что мы можем использовать класс в банках так же, как мы используем в нашей папке классов. Если нет, мы можем извлечь классы в этой банке в нужную папку, а затем использовать их. (Использование Ant будет хорошим) –

ответ

1

соображений простоты повторно использовать код presented in this article, чтобы продемонстрировать необходимые шаги для создания JAXB схемы из класса Java хранится внутри Jar-архиве

Код состоит из двух классов - Служащий и Адрес:

package base.package; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "employee") 
public class Employee 
{ 
    @XmlAttribute 
    private int id; 
    private String name; 
    private double salary; 
    private String designation; 
    private Address address; 

    public int getId() { return id; } 
    public void setId(int id) { this.id = id; } 
    public String getName() { return name; } 
    public void setName(String name) { this.name = name; } 
    public double getSalary() { return salary; } 
    public void setSalary(double salary) { this.salary = salary; } 
    public String getDesignation() { return designation; } 
    public void setDesignation(String designation) { this.designation = designation; } 
    public Address getAddress() { return address; } 
    public void setAddress(Address address) { this.address = address; } 
} 

и ссылочное класс:

package base.package; 

public class Address 
{ 
    private String line1; 
    private String line2; 
    private String city; 
    private String state; 
    private long zipcode; 

    public String getLine1() { return line1; } 
    public void setLine1(String line1) { this.line1 = line1; } 
    public String getLine2() { return line2; } 
    public void setLine2(String line2) { this.line2 = line2; } 
    public String getCity() { return city; } 
    public void setCity(String city) { this.city = city; } 
    public String getState() { return state; } 
    public void setState(String state) { this.state = state; } 
    public long getZipcode() { return zipcode; } 
    public void setZipcode(long zipcode) { this.zipcode = zipcode; } 
} 

Этот код теперь скомпилирован с помощью следующей команды: javac -d bin src/base/package/*.java. Это будет компилировать все исходные файлы, расположенные в ГКЗ в каталог Bin:

base-dir 
|- src 
| \- base 
|  \- package 
|  |- Employee.java 
|  \- Address.java 
\- bin 
    \- base 
     \- package 
     |- Employee.class 
     \- Address.class 

Чтобы получить надлежащую Jar-архив для скомпилированных классов используют: jar -cf test.jar -C bin/ . Это создаст test.jar архив со следующим содержанием:

test.jar 
|- base 
| \- package 
|  |- Employee.class 
|  \- Address.class 
\- META-INF 
    \- MANIFEST.MF 

Теперь вы можете удалить каталог bin и весь его контент, поскольку все файлы, которые нам нужны, хранятся в архиве и доказывают, что схема фактически генерируется из файлов в архиве Jar.

Поскольку все препараты, наконец, сделали, фактический вопрос можно решить - как создать схему из .class-файлов, находящихся в этом архиве test.jar:

Просто запустите эту команду: schemagen -cp test.jar base.package.Employee и он должен генерировать определение схемы аналогична приведенной ниже фрагменте кода:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="employee" type="employee"/> 

    <xs:complexType name="employee"> 
    <xs:sequence> 
     <xs:element name="address" type="address" minOccurs="0"/> 
     <xs:element name="designation" type="xs:string" minOccurs="0"/> 
     <xs:element name="salary" type="xs:double"/> 
     <xs:element name="name" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:int" use="required"/> 
    </xs:complexType> 

    <xs:complexType name="address"> 
    <xs:sequence> 
     <xs:element name="city" type="xs:string" minOccurs="0"/> 
     <xs:element name="line1" type="xs:string" minOccurs="0"/> 
     <xs:element name="line2" type="xs:string" minOccurs="0"/> 
     <xs:element name="state" type="xs:string" minOccurs="0"/> 
     <xs:element name="zipcode" type="xs:long"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

Надежда это было достаточно просто следовать


Изменить: кажется, что jaxb2-maven-plugin, а также ant-task вообще не могут использовать файлы классов, поэтому, возможно, самым простым и простым решением было бы предоставить файл сценария (.bat на окнах; .Sh на * NIX/Mac), где вы просто запустите команду вручную:

Как я в настоящее время работает на Windows 7 скрипт, который автоматически генерирует схему в SCHEMAS подкаталоге проекта будет выглядеть следующим образом:

schemagen -cp path/to/jar/*.jar -d ./schemas/ package.ClassName 

Вы можете просто вызвать этот сценарий (который я поместил в scripts подкаталоге проекта) с использованием Maven EXEC-плагина, который привязан к фазе порождающих-источников:

<plugin> 
    <artifactId>exec-maven-plugin</artifactId> 
    <groupId>org.codehaus.mojo</groupId> 
    <executions> 
     <execution> 
      <id>Generate schemas from class files contained in a jar</id> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       <executable>${basedir}/scripts/generate-sources.bat</executable> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Схемы затем следует автоматически сгенерированный при выполнении mvn generate-sources или любой последующий фаза maven.


Edit: Я изменил сценарий немного, поскольку он может иметь дело с групповыми символами, хотя вы должны указать *.jar вместо только * - но я предполагаю, что это должно быть достаточно хорошо, по крайней мере, это избавит вас от ручного ввода названия Jar-файлов, содержащих JAXB классы

+0

Привет, Роман, спасибо за ваш ответ. Я использую jaxb2-maven-plugin, в котором я не смог указать конкретную «банку». Можете ли вы предложить, как мы можем это сделать? Спасибо –

+0

@WhiteRoses Я обновил свое сообщение, чтобы продемонстрировать решение, которое просто вызывает скрипт, который генерирует схемы из файлов классов, содержащихся в банке. Плагин jaxb, а также schemaGenerationTask из Ant, по-видимому, распознают только классы .java, хотя «schemagen» также может извлекать схему из файлов .class. Если вы или окружающая среда вам нужно запустить, это * nix/Mac, основанная на адаптации сценария, не должна быть проблемой, я думаю. –

0

Вы можете написать программу для создания JAXBContext на модели домена, а затем вызвать метод generateSchema на JAXBContext для генерации XML-схемы.

Пример

import java.io.IOException; 
import javax.xml.bind.*; 
import javax.xml.transform.Result; 
import javax.xml.transform.stream.StreamResult; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(PageableResponse.class); 
     jc.generateSchema(new SchemaOutputResolver() { 

      @Override 
      public Result createOutput(String namespaceURI, String suggestedFileName) 
       throws IOException { 
       return new StreamResult(suggestedFileName); 
      } 

     }); 

    } 

} 
+0

Это, кажется, лучший подход, когда у вас меньше файлов классов. Для большого количества файлов, упакованных в банку, для этого потребуется, чтобы код был написан вручную. В таком случае я поеду с предложенным Романом Воттнером другим ответом. –

Смежные вопросы