在另一个 maven 项目中使用 JAXB2 生成 java 类
Posted
技术标签:
【中文标题】在另一个 maven 项目中使用 JAXB2 生成 java 类【英文标题】:Generate java classes with JAXB2 in another maven project 【发布时间】:2014-04-19 23:01:09 【问题描述】:有人可以帮我解决我的问题吗?
我有两个 maven 项目 A 和 B。 我希望项目 A 包含我所有的模型类,并且在项目 B 中,我正在使用 Spring WS 创建合同优先的 Web 服务。所以在项目 B 中,我使用 maven-jaxb2-plugin 从我的模式生成类。碰巧我的 web 服务项目(项目 A)中的生成类与我的模型项目(项目 A)中的生成类相同(没有 XML 注释)。
因为我不想在我的 Web 服务项目(项目 B)中有重复的类,所以我决定让这个项目依赖于模型项目(项目 A),我接下来想要的是,不再生成类来webservice 项目,但到模型项目(项目 A)。
您认为没有其他方法可以做到这一点吗? 如果可能的话,有人可以帮我这样做吗?
项目 A
package project.a;
public class Client
//...
项目 B
类
package project.b;
public class Compte
//This class manipulates a Client object
//...
JAXB2 Maven 插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>src/main/java</outputDirectory>
<packageName>project.a</packageName>
<schemaDirectory>src/main/webapp/WEB-INF/schemas</schemaDirectory>
<clearOutputDir>false</clearOutputDir>
</configuration>
<plugin>
架构
<element name="client">
<complexType>
<sequence>
<!-- -->
</sequence>
</complexType>
</element>
项目B的spring bean配置
<bean class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="marshaller" ref="marshaller"/>
<property name="unmarshaller" ref="marshaller"/>
<property name="defaultUri" value="http://localhost:8080/project/" />
</bean>
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="project.a"/>
</bean>
【问题讨论】:
现在的做法有问题吗? 当我尝试运行项目 B 时出现类似org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is javax.xml.bind.JAXBException: class project.b.Compte nor any of its super class is known to this context.
的错误,我更新了我的问题并添加了部分 Spring bean 配置文件
你能从你的两个类中粘贴更多代码吗?
【参考方案1】:
您不必再次重新创建模型类。只需将它们放在项目 A 中,然后将这些 bean 导入到项目 B 中:
<import resource="classpath:projectABeanDefinitionFile.xml" />
假设您正在 Compte 类上实现/使用 @XmlRootElement(否则建议通过像 here 这样的教程), 然后将项目B文件更改为:
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound" value="project.b.Compte"/>
</bean>
【讨论】:
感谢您回答我,但这对我不起作用。因为我不得不处理延迟,所以我会采用重复课程的方式,然后再尝试优化。也谢谢你@soulcheck以上是关于在另一个 maven 项目中使用 JAXB2 生成 java 类的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jaxb2-maven-plugin 2.x 从 WSDL 生成 Java 类?
在jaxb2-maven-plugin中为schemagen添加显式源目录