Facebook Twitter LinkedIn E-mail
magnify
Home Posts tagged "Java SE"

Maven 使用指南(8): 使用Maven管理多个项目

可以使用Maven来管理多个项目,首先是添加一个父pom.xml 文件,在所需管理项目的上一级,还是以hibernate tutorial 项目为例:

其中父pom.xml 的packaging 必须为 pom 类型

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd" 
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.hibernate.tutorials</groupId>
  <artifactId>hibernate-tutorials</artifactId>
  <version>4.1.6.Final</version>
  <packaging>pom</packaging>
  <name>Hibernate Getting Started Guide Tutorials</name>
  <description0>
     Aggregator for the Hibernate tutorials presented in the Getting Started Guide
 </description>
  <modules>
    <module>basic</module>
    <module>annotations</module>
    <module>entitymanager</module>
    <module>envers</module>
  </modules>
  <properties>
    <maven.deploy.skip>true</maven.deploy.skip>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.1.6.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.2.145</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <url>http://repo1.maven.org/maven2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Plugin Repository</name>
      <url>http://repo1.maven.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>
  <build>
    <plugins>
       ....
    </plugins>
  </build>
  <reporting>
    ...
  </reporting>
</project>

此时可以把需管理的项目的共用的dependencies ,plugin 移动到这个父pom.xml ,然后使用modules 添加到父pom.xml 中。

修改子项目的pom.xml ,添加一个parent 元素。比如 basic 项目的 pom.xml

project xmlns="http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.hibernate.tutorials</groupId>
        <artifactId>hibernate-tutorials</artifactId>
        <version>4.1.6.Final</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>hibernate-tutorial-hbm</artifactId>
    <name>Hibernate hbm.xml Tutorial</name>
    <description>
	   Hibernate tutorial illustrating the use of native APIs and hbm.xml for mapping metadata
	</description>

    <properties>
        <!-- Skip artifact deployment -->
        <maven.deploy.skip>true</maven.deploy.skip>
    </properties>

</project>

如果使用eclipse IDE ,就更简单了,直接通过modules 来管理模块:

本文是Maven系列教程最后一篇。

 

Maven 使用指南(7): 使用Maven打包资源文件

使用Maven 打包资源文件无需修改pom.xml ,对于一般的Maven项目,Maven 通过标准的文件目录结构来搜寻资源文件,自动将其打包到最终的jar, war包中。

Maven将所有存放在目录${basedir}/src/main/resources 下的所有文件及其目录原封不动的大包到Jar包中,

例如,修改Maven 使用指南(2): 第一个例子Hello World ,在main 目录下创建一个resources 目录,然后创建一个META-INF子目录,在META-INF目录下添加一个application.resources 文件。

然后再命令行使用mvn package 在target 目录下生成HelloWorld-1.0-SNAPSHOT.jar,解压这个文件,可以看到application.resources 文件中目录META-INF目录下:

可以看到META-INF 目录下还有其它一些文件,是有Maven生成的,对于MANIFEST.MF你可以使用自定义的MANIFEST.MF,如果没提供,Maven自动生成一个。

在test 目录中也可以添加resources 目录来使用资源。然后使用如下类似代码来访问资源

// Retrieve resource
InputStream is = getClass().getResourceAsStream( "/application.properties" );

// Do something with the resource

 

Maven 使用指南(6): 使用Maven插件

Maven 使用指南(4): Maven Build 的阶段时介绍过Maven的阶段命令最终是通过Maven的插件来运行的。

Maven采用插件方式的好处是灵活(可以配置),可以扩展(可以开发插件以满足项目Build的需求,比如编译打包项目后,可以通过插件将应用部署到远程服务器等)。

Maven预先定义了很多插件,可以参见http://maven.apache.org/plugins/ ,如果需要另外开发插件,可以参见http://maven.apache.org/plugin-developers/index.html

在Maven中使用插件是通过在pom.xml 中使用plugins 定义,比如 修改缺省的compiler 插件使用Java编译的版本。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.0.2</version>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
  </plugins>
</build>

可以看出使用plugin 的方法和定义依赖的非常类似,其中configuration部分用来配置插件参数。具体可以参见插件文档

Mavne的插件分为两类:

  • Build plugins  在Build生命周期中执行,必须定义在<build/>元素下.
  • Reporting plugins 在生产site阶段运行,定义在<reporting/> 元素。

和定义依赖一样,使用插件也必须定义groupIdartifactId 和version。

 

Maven 使用指南(5): Maven 自动依赖管理

从Maven2 开始,Maven可以自动管理Java应用所引用的开发包(Jar包),原文为transitive dependency (可传递的依赖管理),也就是说Java应用只需要定义其直接引用的Jar包依赖,而无需定义Java应用所引用的所有Jar 依赖。Maven 2可以自动添加Java应用直接引用库所依赖的其它Jar包。

这里我们可以下载hibernate 的一个示例,可以从http://www.hibernate.org/下载,也可以从本站下载.

使用Eclipse –>Import-> Existing Maven Project 打开这个Maven Project。

打开hibernate-tutorials/pom.xml 其dependency 部分定义如下:

<dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.1.6.Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.2.145</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
 

可以看到其直接引用了库有四个: org.hibernate,org.slf4j,junit,com.h2database. 切换到Eclipse pom.xml 的Dependencies 视图。

而实际引用到的所有Jar包的层次如下:

可以看到hibernate-core 又引用了不少其它Jar,这些Maven都可以自动计算出并下载所需依赖。而无需再pom.xml 中一一列出。

在定义dependency时还可以指定其引用的scope,比如有些引用可能只是用在单元测试而不会添加到最终发布的jar包中。Maven支持下面几种Scope:

  • compile: 缺省Scope,应用到Maven所有阶段。
  • provided: 只在编译代码时需要,而无需发布到最终Jar包中。
  • runtime: 只在运行时需要,比如JDBC驱动。
  • test: 只在编译和运行单元测试时需要,比如Juint测试。
 

Maven 使用指南(4): Maven Build 的阶段

有了前面的三篇文章,就可以开始使用Eclipse来创建Maven 项目开发Java应用了。前面用到了

mvn compile

mvn test

mvn package

等命令。

Maven定义了编译打包项目生命周期活动的标准阶段,compile, test ,package 是创建Build生命周期活动的一个阶段。下图定义了Maven Build生命周期的主要阶段。

  • generate-sources: 通常是通过插件支持创建额外的源代码。
  • compile: 编译项目应用代码
  • test-compile: 编译项目单元测试代码
  • test: 运行项目单元测试(一般为Junit 测试)
  • package: 打包项目可以执行代码(以Jar/War/Ear形式)
  • integration-test: 如有需要处理及部署应用以便执行系统集成测试。
  • install: 将应用打包发布到本地Maven 软件包以便其它Maven引用。(注意Install不是指安装Java应用)
  • deploy: 发布到远程Maven软件包以便其他Maven项目下载引用。

每个Maven阶段命令最终是通过Maven的插件来运行的。没个被调用的阶段命令自动调用其生命周期前面的阶段命令,比如mvn package 会依次运行compile , test 阶段命令。

运行Maven阶段命令,是进入到Maven项目包含pom.xml 的目录,

然后运行 mvn [command]

例如 对Hello World  项目运行 mvn package ,命令依次调用 compile, test 及package 本身。

 

如果使用Eclipse IDE,可以通过菜单来执行Maven命令:

 

Java SE引路蜂地图开发示例

引路蜂地图也提供对Java SE平台的支持,可以开发桌面地图应用,由于Java SE的跨平台特性,使用Java SE引路蜂地图开发包开发的地图应用可以运行于Windows ,Lunix,Unix,Mac OS等平台。开发桌面应用比开发移动应用要容易的多,屏幕,内存等方面都比移动平台要宽裕的多。

下面使用一个简单的应用来介绍一下Java SE引路蜂地图开发。示例截图如下

设置引路蜂地图开发包License

引路蜂开发包License分两部分,一个为License文件guidebee.lic ,另一部分为License文件对应的注册码,需在程序运行前初始化

 LicenceManager licenceManager = LicenceManager.getInstance();
long keys[]= {0x41c0df1c118b1831L,0x21884a37bde642bcL,0x15c4d489531ac173L,
   0x5f9e69136c1e3268L,-0x3adaa84e455c5acL,0x2095f679b184dbdfL,};
licenceManager.addLicence("GuidebeeMap_JavaSE", keys);

设置Java SE平台相关图形系统实现

引路蜂地图开发包,在设计时尽量做到平台无关性,将一些平台相关的部分,如图形系统以接口形式定义,如IFont,IGraphics,AbstractGraphicsFactory,IImage。这样在应用到具体平台时,加上平台相关的实现,可以实现同一个库应用到不同的平台。这些平台实现是以源码提供的,如在Java SE平台,提供了JavaSEFont,JavaSEGraphics,JavaSEGraphicsFactory和JavaSEImage类定义,可以参见引路蜂地图API概述

初始化地图对象及设置服务回调函数

MapConfiguration.setParameter(MapConfiguration.WORKER_THREAD_NUMBER, 16);
mapTileDownloadManager = new MapTileDownloadManager(this);
map = new RasterMap(2048, 2048, mapTileDownloadManager);
map.setScreenSize(mapLabel.getWidth(), mapLabel.getHeight());
mapTileDownloadManager.start();
map.setMapDrawingListener(this);
GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778);
map.setCenter(center, 4, MapType.MICROSOFTCHINA);
map.setRoutingListener(this);
map.setGeocodingListener(this);
map.setReverseGeocodingListener(this);

上述代码设置地图工作线程数为16,一般来说增加工资线程数可以提高地图下载及响应速度。
创建地图对象,设置显示区域(屏幕)大小。此外地图服务如查询地址,获取路径都是采用异步方式,通过设置回调函数如setRoutingListener,setGeocodingListener,setReverseGeocodingListener等来通知应用 。

设置地图中心和地图类型

GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778);
map.setCenter(center, 4, MapType.MICROSOFTCHINA);

上述代码将地图中心设置在32.0616667, 118.7777778,地图类型为Bing中国地图,缩放级别为4级,引路蜂内部支持20多种地图类型,并支持自定义地图类型。

地图缩放

RasterMap的 ZoomIn,ZoomOut用来放大和缩小地图,setZoom可以设置地图级别。

地图平移

RasterMap 有两个方法可以用于平移地图,panTo 将地图移动到指定经纬度坐标,panDirection(dx,dy) 将地图从当前位置平移dx,dy 个象素。 下列示例可以上,下,左,右平移地图。

地址查询

地址查询(或称为地址编码)是将输入的地名(如南京林业大学)转换成对应的经纬度坐标然后将其显示在地图上。
所有的地图服务都是采用异步方式调用,在调用RasterMap.getLocation(address)前,需要设置好返回结果时的回调函数RasterMap.setGeocodingListener,回调函数接口定义为IGeocodingListener。 回调方法为public void done(String query,MapPoint[] result) ,如果查询结果不为空,则reusult 为查询结果的数组。示例中将地图转到第一个查询结果。
对于MapAbc 地图服务,还可以指定城市编码,如南京编码为25。
public void getLocation(int citycode,String query, IGeocodingListener listener);

路径查询

可以通过RasterMap的getDirection()方法来查询路径,和查询地址类似,路径查询的结果也是通过回调函数的方式来通知应用程序的,下面的例子返回南京到北京的路径。返回结果存放在MapDirection中,MapDirection包含了路径的详细信息,包括路径的每个步骤,长度,时间,方向等。

地图服务可以选择使用Google 地图服务,CloudMade地图服务,在中国还可能选择MapAbc地图服务,缺省使用Google 地图服务。
getDirections()具有三个重载函数,例子中是采用的文字描述方式。上述示例采用了from: address1 to: address2 的格式, CloudMade地图服务和MapAbc地图服务则必需采用 经度1,纬度1,经度2,纬度2和格式。
为避免混淆,可以使用下述格式。
public void getDirection(GeoLatLng[] waypoints, IRoutingListener listener);
其中 waypoints 为途径点坐标数组经纬值,可以支持多点路径查询。
此外对于MapAbc 地图服务,还可以指定城市编码,如南京编码为25。
public void getDirection(int citycode,String query, IRoutingListener listener);

本地查询

 本地查询可以查询指定区域内诸如宾馆,邮局等用户感兴趣的地方。其使用方法和地址查询非常类似。
本地查询方法public void getLocations(String address,int start,GeoLatLng center,GeoBounds bound, IGeocodingListener listener);
指定中心点和查询区域。本地查询可以多次返回结果,start为查询结果起始顺序,每次返回结果在SearchOptions 中定义,缺省每次返回4个。

选择地图服务

引路蜂地图服务缺省使用Google地图服务,但你也可以选择其它地图服务,比方说当Google服务离线时,您可以选择MapAbc的地图服务,另外要注意的是中国地图是有偏移的。如果想使用无偏移的中国地图,一是采用地图偏移校正算法,另外一个是使用CloudMade地图服务。
所前所述,引路蜂地图开发包在设计时将地图图片显示和地图服务两部分设计成相对独立的两部分,Google中国地图图片,Bing中国地图图片,MapAbc中国地图图片是有偏移的地图图片,CloudMade(OpenStreet)中国地图图片是无偏移的。而Google中国地图服务,MapAbc中国地图服务是有偏移,CloudMade地图服务是无偏移的。所以在选择地图类型和地图服务类型时,要么都选择有偏移,要么都选择无偏移。否则地图在显示路径时或地址时就不匹配。 

 下面列表是合法的组合:

地图类型 MapType   地图服务类型 (DigitalMapService) 
GOOGLECHINA  GOOGLE_MAP_SERVICE 
MICROSOFTCHINA  GOOGLE_MAP_SERVICE 
MAPABCCHINA  GOOGLE_MAP_SERVICE 
OPENSTREETMAP  CLOUDMADE_MAP_SERVICE 
GOOGLECHINA  MAPABC_MAP_SERVICE 
MICROSOFTCHINA  MAPABC_MAP_SERVICE 
MAPABCCHINA  MAPABC_MAP_SERVICE 

地址反编码

地址反编码是通过经纬度查询对应的地名,

注意使用字符串经纬度格式时,纬度在前,经度在后,如果反了,则返回的地名或能为空或都跑到外国去了。结果也是一个数组,一般到第一个结果,后面结果是更大的区域或是距离相对较远的地名。

其它

其它如地图偏移,离线地图,自定义地图,叠加自定义图层可以参加Android平台Android自定义地图示例:QQ地图Android引路蜂地图开发示例:叠加自定义图层 ,Android引路蜂地图开发示例:离线地图示例