Java 进阶 hello world

Java 进阶 hello world!

Java 进阶 hello world! - 中级程序员之路

Java是一种跨平台的语言,号称:“一次编写,到处运行”,在世界编程语言排行榜中稳居第二名(TIOBE index)。

本文目标是帮助 Java 程序员了解中级程序员应有的水平,避免陷入唯“高技术、新概念”的陷阱。Java 编程入门相对比较容易(推荐:Java入门教程)。学完语法后,很多人希望作一些进阶学习,开始编写网站、访问数据库等应用。然而,当程序比较多时,你又觉得 Java 程序很复杂。因此,我们有必要了解 Java 程序的结构与开发理念,站在项目的高度去看 Java 中级程序员需要哪些知识和能力。

1. 约定优于配置(Convention over Configuration/CoC)

1.1 环境配置

  • 操作系统 windows/Linix
  • Java 虚拟机 1.8
  • Maven 3.3+
  • IDE IntelliJ IDEA / Eclipse

1.2 概念与起源

维基百科:约定优于配置是一种软件框架使用的设计範式(原则),旨在减少软件开发人员需做决定的数量,使软件既不失灵活性,且简洁易于理解。

David Heinemeier Hansson 在使用 Ruby on Rails 开发 web 应用时提出这个概念,因为长期做同类项目,项目中程序的组织、命名习惯都会形成最佳实践,遵循这些最佳实践就不仅可以节约开发者沟通时间,而且有利于程序的构建等工作。例如,我们用 MVC 结构去开发 web 程序,程序员都知道控制器类在哪个目录下,完成哪些任务。

我们在第一次学习计算机语言时都会知道概念编码习惯(code conventions)、编程风格(programming idioms)。它们偏向于某种语言的编码规范,例如 C++,Java,Python 都有自己的编码标准,如 google 的编码规范,Pep8编码规范等,这样,IDE 使用这些规范检查你的程序是否符合标准。

约定优于配置偏向于程序的组织于结构,这样编译等工作就可以按约定习惯进行。我们在编译 PyQt 这样的框架时,非常佩服编写 make 脚本的程序员,./configuration, make, make install 这些复杂的脚本是如何保证正确的?简化开发过程中各阶段的配置,让应用开发人员集中精力编写业务处理程序(Java 的理念),不用关心如何实现快速交付、部署等问题,则是约定优于配置要解决的问题。

1.3 Maven 与约定

现在的核心问题是要做哪些约定,如何保证约定的实施?

不同领域的应用约定是不一样的,对于 Java 应用则由构建工具(如: Maven,Gradle)负责一些约定的实现,其他就是特定应用框架如 Spring MVC 等示例代码形成的无形习惯。对于一个普通 Java 程序,它的约定是什么?

(1)生成程序框架

在hello-world目录下,输入如下命令:

$ mvn archetype:generate -DarchetypeCatalog=internal  -DgroupId=com.mycompany.helloproj -DartifactId=helloworld -Dpackage=com.mycompany.helloworld -Dversion=0.0.1

参考:使用mvn archetype:generate生产maven工程,响应很慢
选默认,回车,回车。

Maven 使用惯例优于配置的原则 。它要求在没有定制之前,所有的项目都有如下的结构:

目录 目的
${basedir} 存放 pom.xml
${basedir}/src/main/java 项目的 java源代码
${basedir}/src/main/resources 项目的资源,比如说 property文件、图片等
${basedir}/src/test/java 项目的测试类,比如说 JUnit代码
${basedir}/src/test/resources 测试使用的资源

使用 IntelliJ IDEA 导入项目,就可以看到这样的程序结构:

hello-image

(2)约定应用与组织规范

举例说明,Java 访问资源文件如xxx.xml,如果写成:classpath:/xxx.xml,这个类一定默认加载main/resources/xxx.xml
类似的应用约定很多,学习的办法只有一个,积累!积累!积累!,见多识广。

再看 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>

  <!-- 项目坐标 -->
  <groupId>com.mycompany.helloproj</groupId>
  <artifactId>helloworld</artifactId>
  <version>0.0.1</version>
  <packaging>jar</packaging>

  <!-- 项目名称 -->
  <name>helloworld</name>
  <url>http://maven.apache.org</url>

  <!-- 属性变量 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 项目依赖 -->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

在 pom.xml 所在目录下,输入:

$ mvn package

我们看到 maven 项目做了许多工作:

  1. 下载 junit 库
  2. 复制资源文件
  3. 编译
  4. 测试
  5. 打包

结果,在 target 目录下,出现了 helloworld-0.0.1.jar 文件。

$ mvn install

结果,在 $USER_HOME/.m2/repository/com/mycompany/helloproj/helloworld/0.0.1/ 出现了 helloworld-0.0.1.jar 文件。

在 Maven 配置中, groupId:artifactId:packaging:version 四个元素唯一表示了项目的部件、版本、发布方式。
又称为项目坐标
通常,合理的命名展示了一般公司项目的管理结构。

  • 项目库目录: $USER_HOME/.m2/repository/;
  • 公司目录:com/mycompany/;
  • 项目目录:helloproj/;
  • 部件与版本目录:helloworld/0.0.1/。

通过结构约定,我们定义了企业项目管理的基本方式。

(3)约定开发流程

maven 能支持项目开发不同的生命周期阶段 (lifecycle phase )。但是最常用的是默认的 Maven生命周期 (default Maven lifecycle )。一个 Jar 包的阶段包括:

相关内容推荐