书上有关用ant加上JIBX去绑定java class文件和xml文件这段讲的太少了,而且还不全,我又没用过ant还有JIBX,我尝试了很多次才成功实现了ant基于build.xml去绑定二者的功能,为了避免大家和我遇到一样的问题,我把这一部分粘出来,大家可以做个参考
这是build.xml,没用过ant很多东西都是瞎搞出来的,这个build.xml是我去那本书的源码上拷贝了一份,就书上那点屁用没有
<?xml version="1.0"?>
<!-- ===================================================================
Ant build file for JiBX data binding code to schema starter example.
=================================================================== -->
<project basedir="." default="full">
<available file="/lib/jibx-bind.jar" property="jibx-home" value=""/>
<property environment="env"/>
<condition property="jibx-home" value="${env.JIBX_HOME}">
<and>
<not>
<isset property="jibx-home"/>
</not>
<available file="${env.JIBX_HOME}/lib"/>
</and>
</condition>
<!-- End of jibx-home location setting block. -->
<!-- make sure required jars are present -->
<condition property="runtime-jars-found">
<available file="${jibx-home}/lib/jibx-run.jar"/>
</condition>
<condition property="binding-jars-found">
<and>
<available file="${jibx-home}/lib/bcel.jar"/>
<available file="${jibx-home}/lib/jibx-bind.jar"/>
<available file="${jibx-home}/lib/jibx-run.jar"/>
</and>
</condition>
<available property="extras-jar-found" file="${jibx-home}/lib/jibx-extras.jar"/>
<!-- set classpath for compiling and running application with JiBX -->
<path id="classpath">
<fileset dir="${jibx-home}/lib" includes="*.jar"/>
<pathelement location="bin"/>
</path>
<!-- make sure runtime jars are present -->
<target name="check-runtime">
<echo message="-------------->${env.JIBX_HOME}"></echo>
<fail unless="jibx-home">JiBX home directory not found - define JIBX_HOME system property or set path directly in build.xml file.</fail>
<fail unless="runtime-jars-found">Required JiBX runtime jar jibx-run.jar was not found in JiBX home lib directory (${jibx-home}/lib)</fail>
</target>
<!-- make sure extras jars are present -->
<target name="check-extras" depends="check-runtime">
<fail unless="extras-jar-found">Required JiBX extras jar jibx-extras.jar was not found in JiBX home lib directory (${jibx-home}/lib)</fail>
</target>
<!-- make sure binding jars are present -->
<target name="check-binding" depends="check-runtime">
<fail unless="binding-jars-found">Required JiBX binding jar jibx-bind.jar or bcel.jar was not found in JiBX home lib directory (${jibx-home}/lib)</fail>
</target>
<!-- clean compiled class files and output file -->
<target name="clean">
<delete quiet="true" dir="${basedir}/bin/com/phei/netty/protocol/http/xml/pojo"/>
<delete quiet="true" file="${basedir}/binding.xml"/>
<delete quiet="true">
<fileset dir="${basedir}" includes="out*.xml"/>
<fileset dir="${basedir}" includes="*.xsd"/>
</delete>
</target>
<!-- compile the classes -->
<target name="compile" depends="clean,check-runtime">
<echo message="Compiling Java source code"/>
<delete quiet="true" dir="${basedir}/bin/com/taikang/httpxml/domain"/>
<mkdir dir="${basedir}/bin"/>
<javac target="1.8" srcdir="${basedir}/src/main/java/com/taikang/httpxml/domain" destdir="${basedir}/bin" debug="on">
<classpath refid="classpath"/>
</javac>
</target>
<!-- generate default binding and schema -->
<target name="bindgen">
<echo message="Running BindGen tool"/>
<java classpathref="classpath" fork= "true" failonerror="true" classname="org.jibx.binding.generator.BindGen">
<arg value="-s"/>
<arg value="${basedir}/src/com/taikang/httpxml/domain"/>
<arg value="com.taikang.httpxml.domain.Order"/>
</java>
</target>
<!-- bind as a separate step -->
<target name="bind" depends="check-binding">
<echo message="Running JiBX binding compiler"/>
<taskdef name="bind" classname="org.jibx.binding.ant.CompileTask">
<classpath>
<fileset dir="${jibx-home}/lib" includes="*.jar"/>
</classpath>
</taskdef>
<bind binding="${basedir}/binding.xml">
<classpath refid="classpath"/>
</bind>
</target>
<!-- compile, generate default, compile binding, run test -->
<target name="full" depends="compile,bindgen,bind"/>
<target name="help">
<echo message="Targets are:" />
<echo message="http://sourceforge.net/projects/jibx"/>
</target>
</project>
给大家不懂ant的解释一下,当前你要是点执行ant build,是走名字叫做“full”的这个任务,这个任务里有子任务会先执行,像compile,bindgen,bind,都执行完了然后执行help那个任务
当然你也可以修改
default里的执行的任务名字,分别按顺序执行compile操作(编译),bindgen(根据class生成binding.xml和xsd文件),bind(根据前边生成的那俩个文件生成绑定关系如下图)
总之看你心情,注意执行的时候看日志,出现什么错误好好找,我找了两天才彻底解决JIBX和ant的各种问题,我下了个JIBX的安装包,配置了环境变量,忘记了在eclipse里是不是安插件了,应该是有配置或者安装插件的操作,那个大家百度下JIBX的用法应该都有教学
注意,之后你要是执行TestOrder这个测试方法,是会报错的,报找不到Order这个类的class文件,可是你明明编译了,他还让你确认make sure you have compiled ,狗屁,就是没找到,记得把bin目录下
这一堆class看见没,都挪到你项目的target目录里,就是IDE(代码编辑器,eclipse或者idea intellij)的自动编译后的目录位置,覆盖掉,再执行main方法就可以了
结果下图
忘了粘代码了,补一下,各位看到了给点个赞,评论下都行啊
package com.taikang.httpxml.domain;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import org.jibx.runtime.BindingDirectory;
import org.jibx.runtime.IBindingFactory;
import org.jibx.runtime.IMarshallingContext;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;
public class TestOrder {
private IBindingFactory factory = null;
private StringWriter writer = null;
private StringReader reader = null;
private final static String CHARSET_NAME = "UTF-8";
private String encode2Xml(Order order) throws JiBXException, IOException{
System.out.println(order.getClass());
factory = BindingDirectory.getFactory(Order.class);
writer = new StringWriter();
IMarshallingContext mctx = factory.createMarshallingContext();
mctx.setIndent(2);
mctx.marshalDocument(order, CHARSET_NAME, null, writer);
String xmlStr = writer.toString();
writer.close();
System.out.println(xmlStr.toString());
return xmlStr;
}
private Order decode2Order(String xmlBody) throws JiBXException {
reader = new StringReader(xmlBody);
IUnmarshallingContext uctx = factory.createUnmarshallingContext();
Order order = (Order) uctx.unmarshalDocument(reader);
return order;
}
public static void main(String[] args) throws JiBXException, IOException {
TestOrder test = new TestOrder();
Order order = new Order();
System.out.println("haha");
order.setOrderNumber(123);
order.setTotal(9999.999f);
Address address = new Address();
address.setCity("北京");
address.setCountry("中国");
address.setPostCode("330000");
address.setState("变身中");
address.setStreet1("贝克街");
order.setBillTo(address);
Customer customer = new Customer();
customer.setCustomerNumber(123);
customer.setFirstName("孙");
customer.setLastName("悟空");
order.setCustomer(customer);
order.setShipping(Shipping.INTERNATIONAL_MAIL);
order.setShipTo(address);
String body =test.encode2Xml(order);
Order order2 = test.decode2Order(body);
System.out.println(order2);
}
}
package com.taikang.httpxml.domain;
public enum Shipping {
STANDARD_MAIL,PRIORITY_MAIL,INTERNATIONAL_MAIL,DOMESTIC_EXPRESS,INTERNATIONAL_EXPRESS
}
package com.taikang.httpxml.domain;
public class Order {
private long orderNumber;
private Customer customer;
/** Billing address information*/
private Address billTo;
private Shipping shipping;
/** Shipping address information.If missing,the billing address is also used as the shipping address */
private Address shipTo;
private Float total;
public long getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(long orderNumber) {
this.orderNumber = orderNumber;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public Address getBillTo() {
return billTo;
}
public void setBillTo(Address billTo) {
this.billTo = billTo;
}
public Shipping getShipping() {
return shipping;
}
public void setShipping(Shipping shipping) {
this.shipping = shipping;
}
public Address getShipTo() {
return shipTo;
}
public void setShipTo(Address shipTo) {
this.shipTo = shipTo;
}
public Float getTotal() {
return total;
}
public void setTotal(Float total) {
this.total = total;
}
@Override
public String toString() {
return "Order [orderNumber=" + orderNumber + ", customer=" + customer + ", billTo=" + billTo + ", shipping="
+ shipping + ", shipTo=" + shipTo + ", total=" + total + "]";
}
}
package com.taikang.httpxml.domain;
import java.util.List;
public class Customer {
private long customerNumber;
private String firstName;
private String lastName;
private List<String> middleNames;
public long getCustomerNumber() {
return customerNumber;
}
public void setCustomerNumber(long customerNumber) {
this.customerNumber = customerNumber;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public List<String> getMiddleNames() {
return middleNames;
}
public void setMiddleNames(List<String> middleNames) {
this.middleNames = middleNames;
}
@Override
public String toString() {
return "Customer [customerNumber=" + customerNumber + ", firstName=" + firstName + ", lastName=" + lastName
+ ", middleNames=" + middleNames + "]";
}
}
package com.taikang.httpxml.domain;
public class Address {
private String street1;
private String street2;
private String city;
private String state;
private String postCode;
private String country;
public String getStreet1() {
return street1;
}
public void setStreet1(String street1) {
this.street1 = street1;
}
public String getStreet2() {
return street2;
}
public void setStreet2(String street2) {
this.street2 = street2;
}
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 String getPostCode() {
return postCode;
}
public void setPostCode(String postCode) {
this.postCode = postCode;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "Address [street1=" + street1 + ", street2=" + street2 + ", city=" + city + ", state=" + state
+ ", postCode=" + postCode + ", country=" + country + "]";
}
}