我试图基本上使用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) 当我尝试使用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源代码生成模式?
我实际上正在使用架构第一种方法,但是我遇到了"不祥的" 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.html和http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/schemagen-mojo.html上的文档接缝表明这应该是它,但我无法弄清楚我做错了什么.
我如何阻止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) 我使用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)
我们用
有没有办法控制这个订单?
我正在尝试使用 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) 根据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包(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