标签: schemagen

从Maven中的JAXB类型生成XSD架构?

我试图基本上使用Maven插件从我在JAXB中注释的模型类生成XSD模式.这是我的POM中的相关代码:

<plugin>
    <groupId>com.sun.tools.jxc.maven2</groupId>
    <artifactId>maven-jaxb-schemagen-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>

    <configuration>
        <project>${project}</project>
        <destdir>${project.build.directory}/schemas</destdir>
        <srcdir>${project.build.sourceDirectory}/com/floodstream/wowza/mastercontrol/model</srcdir>
        <verbose>true</verbose>
    </configuration>

    <dependencies>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-xjc</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-xjc</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
</plugin>

<!-- other stuff omitted for brevity -->

<pluginRepository>
    <id>maven-repository.dev.java.net</id>
    <name>Java.net Maven 2 Repository</name>
    <url>http://download.java.net/maven/2</url>
</pluginRepository>
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] org/apache/tools/ant/taskdefs/Javac
org.apache.tools.ant.taskdefs.Javac
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.NoClassDefFoundError: org/apache/tools/ant/taskdefs/Javac
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at …
Run Code Online (Sandbox Code Playgroud)

jaxb maven schemagen

14
推荐指数
1
解决办法
2万
查看次数

是否有可能让maven-jaxb-schemagen-plugin与Java 7一起使用?

当我尝试使用maven-jaxb-schemagen-pluginjava 7时

<groupId>com.sun.tools.jxc.maven2</groupId>
<artifactId>maven-jaxb-schemagen-plugin</artifactId>
<version>1.2</version>
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

[ERROR] Failed to execute goal com.sun.tools.jxc.maven2:maven-jaxb-schemagen-plugin:1.2:generate (default) on project TopologyProvisionerDom: Execution default of goal com.sun.tools.jxc.maven2:maven-jaxb-schemagen-plugin:1.2:generate failed: A required class was missing while executing com.sun.tools.jxc.maven2:maven-jaxb-schemagen-plugin:1.2:generate: com/sun/mirror/apt/AnnotationProcessorFactory
Run Code Online (Sandbox Code Playgroud)

好像AnnotationProcessorFactory在Java 7中被删除/弃用了?有可能让jaxb schemagen使用这个插件工作吗?在使用JDK 7时,是否有另一种方法可以从JAXB源代码生成模式?

java jaxb schemagen java-7

7
推荐指数
2
解决办法
8073
查看次数

JAXB schemagen不引用剧集文件中的类

我实际上正在使用架构第一种方法,但是我遇到了"不祥的" JAXB Map问题的障碍!并通过切换到这个代码的第一种方法来解决它.现在,我想在其他模块中重用此类型,并通过从生成的模式创建一个剧集文件来继续我的模式第一种方法.不幸的是,生成的剧集文件是空的.这是我尝试过的:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>schemagen</id>
            <goals>
                <goal>schemagen</goal>
            </goals>
            <phase>generate-sources</phase>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
        <generateEpisode>true</generateEpisode>
        <transformSchemas>
            <transformSchema>
                <uri>http://some/schema/types</uri>
                <toPrefix>core</toPrefix>
                <toFile>core-types.xsd</toFile>
            </transformSchema>
        </transformSchemas>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

这为我生成了以下架构:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:core="http://some/schema/types" targetNamespace="http://some/schema/types" version="1.0">
  <xs:element name="Map" type="core:MapType"/>

  <xs:complexType name="MapType">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" minOccurs="0" name="entries" nillable="true" type="core:EntryType"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="EntryType">
    <xs:sequence>
      <xs:element name="key" type="xs:anyType"/>
      <xs:element name="value" type="xs:anyType"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

以及包含此内容的剧集文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:bindings version="2.1" xmlns:ns1="http://java.sun.com/xml/ns/jaxb"/>
Run Code Online (Sandbox Code Playgroud)

我尝试使用schemagen standalone(版本2.2.11),结果类似.https://jaxb.java.net/2.2.4/docs/schemagen.htmlhttp://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/schemagen-mojo.html上的文档接缝表明这应该是它,但我无法弄清楚我做错了什么.

java jaxb jaxb2 schemagen jaxb2-maven-plugin

6
推荐指数
1
解决办法
467
查看次数

阻止schemagen将超类添加到模式中?

我如何阻止schemagen将超类添加到模式?

我已尝试XMLTransient在超类上使用它的字段,但它们仍然出现在模式中.

例如 :

@XmlTransient
public class Asset {

   @XmlTransient
   public Long ID;
}

public class Movie extends Asset {

}
Run Code Online (Sandbox Code Playgroud)

创建此架构:

<xs:complexType name="asset">
<xs:sequence>
<xs:element name="ID" type="xs:long" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="movie">
<xs:complexContent>
<xs:extension base="asset">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>

the schema that i would like to see is :

<xs:complexType name="movie">
<xs:complexContent>
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

java jaxb schemagen

5
推荐指数
1
解决办法
790
查看次数

schemagen.exe生成具有<xs:complexType>的非确定顺序的xsd模式

我使用org.codehaus.mojo jaxb2-maven-plugin为我的类生成xsd模式.插件站点 http://mojo.codehaus.org/jaxb2-maven-plugin/faq.html告诉,该插件使用JDK实用程序schemagen.exe进行生成. 问题是生成的xsd中的顺序未确定,并且取决于您运行插件的计算机.

public class One {
    public String field1;
}

public class Two {
    public String field2;
}
Run Code Online (Sandbox Code Playgroud)

并生成方案:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="two">
    <xs:sequence>
      <xs:element name="field2" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>  

  <xs:complexType name="one">
    <xs:sequence>
      <xs:element name="field1" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

但是,当我的同事经营一代时,他会得到另一个订单:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="one">
    <xs:sequence>
      <xs:element name="field1" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>


  <xs:complexType name="two">
    <xs:sequence>
      <xs:element name="field2" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType> 

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

我们用

  • JDK 1.6.0_26
  • jaxb2-maven-plugin 1.3
  • jaxb-impl版本2.1.12(由插件使用)

有没有办法控制这个订单?

xsd jaxb schemagen jaxb2-maven-plugin

5
推荐指数
1
解决办法
509
查看次数

使用 jaxb-ri-2.2.7 的 ant schemagen 任务中的 ClassCastException

我正在尝试使用 JAXB-RI 2.2.7 中的 schemagen ant 任务,但我一直在 build.xml 中的 schemagen 任务上收到“BUILD FAILED .... Error started ap”。相关的节如下:

<taskdef name="schemagen" classname="com.sun.tools.jxc.SchemaGenTask">
  <classpath refid="compile.classpath"/>
</taskdef>

<target name="schemas" description="Compile all Java source files">
 <mkdir dir="${schemas.dir}" />
 <schemagen destdir="${schemas.dir}">
  <src path="${src.dir}"/>
  <classpath refid="compile.classpath" />
 </schemagen>
</target>
Run Code Online (Sandbox Code Playgroud)

使用 -verbose,我得到下面的堆栈跟踪。我试过在谷歌上搜索 ClassCastException 的详细信息,但没有找到任何东西。有什么建议?

谢谢,亚当

BUILD FAILED
/home/adam/sandboxes/adam/sensei/code/trunk/repository/build.xml:99: Error starting ap
    at com.sun.tools.jxc.ApBasedTask$InternalApAdapter.execute(ApBasedTask.java:131)
    at com.sun.tools.jxc.ApBasedTask.compile(ApBasedTask.java:170)
    at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:930)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.Target.performTasks(Target.java:456)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
    at …
Run Code Online (Sandbox Code Playgroud)

java xml ant jaxb schemagen

5
推荐指数
1
解决办法
1155
查看次数

您如何在Java 11中调用schemagen?

根据Oracle文档,schemagen工具已作为JEP 320(http://openjdk.java.net/jeps/320)的一部分从JDK中删除。JEP指出了现在提供缺少工具的Maven工件。在JEP中,工件的坐标是错误的,可以在以下问题的答案中找到更新的坐标: 我的Maven项目中应为JAXB RI使用哪些工件?

但是缺少的是如何调用工具。JEP中指向的Shell脚本位于JAXB-RI Git存储库中。但是,这些脚本仍然没有文档记录,很难调用。该git repo中的构建说明指示它是使用标准的“ mvn全新安装”构建的,但是不会产生与此处文档中使用的“ bin”文件夹相匹配的输出结构:https : //javaee.github.io /jaxb-v2/doc/user-guide/ch04.html#tools-schemagen

理想情况下,我想从Gradle运行schemagen,避免使用shell脚本,因为它们不是从maven依赖项获得的。

我当前的尝试是从一个称为旧schemagen.exe的工作版本改编而成,看起来像这样:

(“真实” build.gradle文件中还有更多内容可以指定我的应用程序的依赖关系,等等。)

configurations {
  schemagenTool
}
dependencies {
  schemagenTool "org.glassfish.jaxb:jaxb-jxc:${jaxbVersion}"
}
task schemaGen(type: Exec, dependsOn: [compileJava,configurations.schemaGenTool]) {
  workingDir projectDir
  executable 'java'

  doFirst {
    file('build/Schemas').mkdirs()
    args '--module-path', "${configurations.schemaGenTool.asPath}",
         '-m', 'jaxb.jxc/com.sun.tools.jxc.SchemaGeneratorFacade',
         // Note: automatic module name is NOT com.sun.tool.jxc
         // as documented
         // Args to schemagen (these worked for the schemagen.exe)
         '-d', 'build/Schemas',
         '-classpath', "${compileJava.destinationDir}${File.pathSeparator}${configurations.compile.asPath}",
         "src/main/java/path/to/my/ModelClass.java"
         //println "\nschemagen: ${args.join(' ')}\n"
  }

  doLast {
    // Above …
Run Code Online (Sandbox Code Playgroud)

java jaxb2 gradle schemagen java-11

5
推荐指数
1
解决办法
1620
查看次数

schemagen ant task忽略package-info.java

方案如下:我有一个java包(myapp.config),它包含我所有的JAXB注释类,我想从中生成一个XML模式文件.在包中,还有一个package-info.java文件,它在包元素上包含@XmlSchema注释,因此在整个包中有效:

@XmlSchema(namespace="http://myapp/config",
           xmlns = @XmlNs(prefix="myapp", namespaceURI="http://myapp/config"),
           elementFormDefault=XmlNsForm.QUALIFIED)
package myapp.config;
Run Code Online (Sandbox Code Playgroud)

当我运行JDK附带的schemagen命令行工具时,

D:\Projects\Myapp>"%JAVA_HOME%/bin/schemagen" -cp "%JAVA_HOME%/lib/tools.jar"
src/myapp/config/*.java
Run Code Online (Sandbox Code Playgroud)

我得到了正确的结果:生成的schema1.xsd文件中的根元素包含targetNamespace和其他必要的属性:

<xs:schema elementFormDefault="qualified" version="1.0"
           targetNamespace="http://myapp/config"
           xmlns:tns="http://myapp/config"
           xmlns:myapp="http://myapp/config">
           xmlns:xs="http://www.w3.org/2001/XMLSchema" >
Run Code Online (Sandbox Code Playgroud)

但是,当我想在我的Ant脚本中执行相同的任务时,

<schemagen srcdir="src/myapp/config" destdir="dist">
    <include name="*.java"/>
</schemagen>
Run Code Online (Sandbox Code Playgroud)

schemagen工具似乎完全忽略了命名空间注释,因为在生成的schema1.xsd文件中,没有它们的痕迹:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
Run Code Online (Sandbox Code Playgroud)

当我以详细调试模式运行schemagen任务时,很明显该工具会加载除package-info.java之外的所有.java文件,这就是为什么它不知道命名空间的原因.

你以前遇到过这种奇怪的行为吗?为什么命令行工具处理包信息文件,而Ant任务不处理?我该怎么做才能使Ant任务工作?

提前谢谢,
buc

ant jaxb jaxb2 schemagen

2
推荐指数
1
解决办法
3088
查看次数

标签 统计

schemagen ×8

jaxb ×7

java ×5

jaxb2 ×3

ant ×2

jaxb2-maven-plugin ×2

gradle ×1

java-11 ×1

java-7 ×1

maven ×1

xml ×1

xsd ×1