Java 9 前/后使用 JAXB (包括支持 javax.* 或 jakarta.*)

使用 Java 处理 Object 与 XML 之间的转换时 JAXB(Java Architecture for XML Binding) 仍然被广泛使用。但随着 Java 9 模块化后把 JAXB 从标准 JDK 中移除后,和 Java EE 8(Jakarta EE 8) 到 Jakarta EE 9 的变迁时命名空间由 javax.* 变成了 jakarta.*,我们在使用 JAXB 时需作出相应的适配。

本文分别使用 Java 1.8, 17,通过 Maven 插件 jaxb2-maven-plugin 的 xjc (从 xsd 文件生成 Java 类), 和如何切换 jakarta.* 命名空间,由此可给我们对使用了 JAXB 的项目升级 JDK 时指明方向。从而不致于因不了解每部分组件的具体功效而在 pom.xml 中胡乱配置,比如之前对 jaxb2-maven-plugin 插件本身配置了多余的 org.glassfish.jaxb:jaxb-xjc 和 org.glassfish.jaxb:jaxb-runtime 依赖,也未能理解 jaxb2-maven-plugin 与 org.glassfish.jaxb:jaxb-runtime 之间的版本对应关系。

 实验准备,创建简单的 Maven 项目,并在路径 src/main/xsd/ 下新建 Schema 文件 sample.xsd,内容为 阅读全文 >>

一个最基础的 Spring 4 MVC Maven 项目

这是一个最基本的 Spring 4 MVC 的 Maven 项目,非 SpringBoot 的,SpringBoot 由于有许多自动化配置特性,会更简单些。本例全部用 Java 代码作为配置,免除了创建 web.xml 和如 dispatcher-servlet.xml 这样的文件。本人更倾向于 Java 配置,它的优势在于能进行编译期检查,逻辑性也强,配置文件只是改动无需重新编译,都是要重启服务的; 关于使用 XML 配置文件的方式可参考文后的链接。

本文侧重于 Spring MVC 项目提供 RESTful JSON API, 因而静态 Web 内容提及较少。创建一个 Maven 项目的方式,可以直接创建一个 pom.xml 文件,然后编辑它的内容,使用 IntelliJ IDEA 的话只需要选择导入为一个 Maven 项目就成,Eclipse 的话可能还要事先运行 mvn eclipse:eclipse 初始化一下。

项目结构布局

就是一个普通的 Maven 项目,稍稍不同的是 src/main 目录中除了 java 和 resources 之外,还有 webapp 目录,用于存放 web 静态文件或模板文件的。 阅读全文 >>

IntelliJ IDEA 中创建 Maven Scala 项目

Scala 项目看家的构建工具当然是 SBT, 假如我们已习惯于 Maven, 想要用 Maven 来构建 Scala 项目该如何做呢?那首先要找到一个 Maven Scala 相应的 Archetype, 然后用命令 mvn archetype:generate 或是在 IntelliJ IDEA 使用 Maven 项目创建向导来选择一个 Maven Scala Archetype。这里主要介绍 IntelliJ IDEA 中 Maven 向导创建 Scala 项目的方式。

首先确保我们已安装了 IntelliJ IDEA 的 Maven 和  Scala 插件。插件中自带了 org.scala-tools.archetypes:scala-archetype-simple:1.2 的 Maven archetype, 这是一个貌视 Scala 官方的 archetype。我们可以尝试基于它来创建一个 Maven Scala 项目。通过 IntelliJ IDEA 的菜单 File/New/Project..., 在弹出的窗口中选择 Maven/Create from archetype, 然后找到 scala-archetype-simple, 自带版本为 1.2, 当前最新版也不过 1.3, 那还是  2010 年建立,别提有多老了。 阅读全文 >>

Maven 工程生成可执行的 JAR 包

远离 Maven 工程有些时日了,也不知道当前还是否在流行 Maven 管理工程与依赖,当前类似工具有 Ant+Ivy, Grunt, sbtGradle。Web 工程的输出发布包没什么好说的,因为 <packaging>war</packaging>,所以 mvn package 出来的 WAR 包里就有站点运行的所有内容了,用到的依赖会在 WEB-INF/lib 目录下列着。

而对于那些 <packaging>jar</packaging> 的工程,用 mvn package 只会生成一个 JAR 包,它所依赖的各个类库仍然分散在本地仓库中,而我们的发布包应该包含这些第三方依赖的。

假定,有一个 GoSSH  Maven 工程,设定的版本是 0.0.1,它依赖了 jsch-0.1.50, commons-cli-1.3-SNAPSHOT,想要发布的包有如下布局

GoSSH-0.0.1.jar
lib
        jsch-0.1.50.jar
        commons-cli-1.3-20140216.032825-101.jar     #这里的 revision 号是随 SNAPSHOT 动态而定的

并且在 GoSSH-0.0.1.jar 中的 META-INF/MANIFEST.MF 文件中指定了 阅读全文 >>

Maven使用第三方jar文件的两种方法

在Maven中,使用第三方库一般是通过pom.xml文件中定义的dependency从远程repository中下载该库。但是如果库文件是公司内部的库,或者在本地而不能通过远程repository下载,这种情况下,有两种方法可以满足需求。

方法一:

将本地的jar文件安装到本地repository中,具体步骤如下:
1、准备好本地的jar文件
2、使用如下命令安装jar文件
      mvn install:install-file -Dfile=abc.jar
     -DgroupId=com.mycompany.myproduct -DartifactId=abc
     -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
    其中,-Dfile制定jar文件的位置。执行完该命令后,会在本地repository(通常是$HOME\.m2目录)中出现一个目录(com),在其下会有一个abc-1.0.jar的文件和一个自动产生的pom文件。 阅读全文 >>

用 DbUnit 执行 export 导出数据时报 MySQLSyntaxErrorException

我是借助于 dbunit-maven-plugin 来使用 DbUnit 的,数据库是 MySql,在使用 mvn dbunit:export 指令时,总报错:

Embedded error: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc from unmi_test_table order by Id' at line 1

若是加上 -e 或 -X 参数,如 mvn dbunit:export -e 时可以看到更详细的异常信息:

Caused by: org.apache.maven.plugin.MojoExecutionException: Error executing export 阅读全文 >>

用 dbunit-maven-plugin 来管理你的测试数据

单元测试有人写过,也有人没做过,数据库的 dbunit 的用的人应该更少了,它可以用来给你做测试准备数据。一般我们做测试会在一个测试数据库中不停的测,自然会累积许多垃圾数据,给单元测试会造成不便,功能测试倒无太紧要。如果我们想在单元测试的时候有一份干净的数据,有个做法是搞个备用的数据库,测试前导到测试库的,或用某些数据库的导入导出功能。

这里我们来看 dbunit 怎么实现准备测试数据的,它可以用来导出数据库数据到数据文件中,从数据文件中导入干净的数据到数据库中,比较数据库与数据文件、或增量的插入记录等等。 阅读全文 >>

Maven 开发者手册翻译进行中......

看到 Maven 不断的演进, 著名的  Appfuse 也摒弃了 Ant 而采用了 Maven 作为它的构建管理工具,各个 Java IDE 对于 Maven 的支持也是纷纷上马,所以急迫的感觉对于 Maven 的出现是不容忽视了。Ant 纵然是能满足于我们的需求,不过 Ant 的 build.xml 脚本总那么臃肿不堪,不利于阅读。

而 Maven 与 Ant 同出一族,为 Apache 门下的师兄弟。既然 Apache 会再发明这样一个新轮子,相比于 Ant 确有它的许多独到之处。Maven 依赖了 ant-x.x.x 包,但要说是建立在 Maven 之上的话恐有不太合适。

关于 Maven 与 Ant 之间比较的文章在网上能找到不少,如 maven和ant的比较。具体的不细说,略表几个 Maven 关键之处:1. 对依赖包的处理十分优雅;2. 有大量可用的插件支持;3. 便于与其他工具的支持;4. 适合于多项目的开发。本人也是接触不久,还有许多有待发掘。 阅读全文 >>

Maven 1 的 Unknown error downloading; status code was: 301 错误解决

现在早已是 Maven 2 了,可还是有机会用了一下 Maven 1,所用的版本是 Maven 1.0.2,刚开始尝试的时候出现以下两个问题:

1. 执行 maven genapp 时产生如下异常:

???????? commons-jelly-tags-interaction-20030211.143817.jar????
Error retrieving artifact from [http://www.ibiblio.org/maven/commons-jelly/jars/commons-jelly-tags-interaction-20030211.143817.jar]: java.net.ConnectException: Connection timed out: connect
?????? commons-jelly-tags-interaction-20030211.143817.jar ?????§°???
???????????????±???????¨??????????

commons-jelly-tags-interaction-20030211.143817.jar 阅读全文 >>