# package-demo **Repository Path**: nickforthink/package-demo ## Basic Information - **Project Name**: package-demo - **Description**: maven打包demo: 1、标准maven工程目录 2、配置文件与jar分离 3、当前工程jar与lib分离 4、当前工程jar可执行,附带执行脚本 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2016-12-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # package-demo 1、标准maven工程目录 2、配置文件与jar分离 2.1 读取配置文件类需要使用读取绝对路径方式读取,不能直接读取classpath下。 详见PropertyConfigurer类 2.2使用classpath直接读取 详见 start2.bat 脚本,使用-classpath参数指定classpath。 java -classpath ".;config;lib/*" com.giiso.app.AppMain 3、当前工程jar与lib分离。 pom文件注释掉的部分 执行start.bat 3、当前工程jar与lib一起,配置文件打包进jar中。pom文件注释掉的部分. start2.bat 4、当前工程jar可执行,附带执行脚本 # Maven内置变量说明: ${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version} ${project.packaging} 打包类型,缺省为jar ${project.xxx} 当前pom文件的任意节点的内容 ## Maven 标准目录结构 目录 | 说明 | ---------------|------| src/main/java | Application/Library sources | src/main/resources | Application/Library resources | src/main/filters | Resource filter files | src/main/assembly | Assembly descriptors | src/main/config | Configuration files | src/main/scripts | Application/Library scripts | src/main/webapp Web | application sources | src/test/java | Test sources | src/test/resources | Test resources | src/test/filters | Test resource filter files | src/site | Site | LICENSE.txt | Project's license | NOTICE.txt | Notices and attributions required by libraries that the project depends on | README.txt | Project's readme | 使用目录模板,可以使 pom.xml 更简洁。因为 Maven2 已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以 resources 目录为例: src/main/resources,负责管理项目主体的资源。在使用Maven2执行compile之后,这个目录中的所有文件及子目录,会复制到target/classes目录中,为以后的打包提供了方便。 src/test/resources,负责管理项目测试的资源。在使用Maven2执行test-compile之后,这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后续的测试做好了准备。 这些动作在 Maven1 中,是需要在 maven.xml 中使用来完成的。如今,完全不需要在pom.xml中指定就能够自动完成。在src和test都使用resources,方便构建和测试,这种方式本就已是前人的经验。通过使用Maven2,使这个经验在开发团队中得到普及。 创建标准目录模板,可以通过如下命令: mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons groupId和artifactId的含义与Maven1中的含义一样,参数artifactId的值会作为项目根目录的名字。除了建立相应的目录之外,Maven2还会创建缺省的pom.xml。 Maven2也考虑到:不同类型的项目需要拥有不同的目录结构。如创建web项目,可以使用命令: mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp Maven 生命周期 在Maven2中有了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段: validate,验证工程是否正确,所有需要的资源是否可用。 compile,编译项目的源代码。 test-compile,编译项目测试代码。 test,使用已编译的测试代码,测试已编译的源代码。 package,已发布的格式,如jar,将已编译的源代码打包。 integration-test,在集成测试可以运行的环境中处理和发布包。 verify,运行任何检查,验证包是否有效且达到质量标准。 install,把包安装在本地的repository中,可以被其他工程作为依赖来使用 deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。 generate-sources,产生应用需要的任何额外的源代码,如xdoclet。 如果要执行项目编译,那么直接输入:mvn compile即可,对于其他的阶段可以类推。阶段之间是存在依赖关系(dependency)的,如test依赖test-compile。在执行mvn test时,会先运行mvn test-compile,然后才是mvn test。 ## Maven 关键词 Project: 任何你想 build 的事物,Maven都会把它们当作是一个 Project。 这些 Project 被定义为 POM(Project Object Model)。 一个 Project 可以依赖其他的project,一个 project 也可以有多个子project组成。 POM: POM(pom.xml) 是 Maven 的核心文件,它是指示 Maven 如何工作的元数据文件,类似 ant 的 build.xml 文件。 pom.xml 文件应该位于每个 Project 的根目录。 GroupId: 顾名思义,这个应该是公司名或组织名。 ArtifactId: 构建出来的文件名,一般来说或,这个也是project名。 Packaging: 项目打包的类型,可以是将jar、war、rar、ear、pom,默认是jar。 Version: 项目的版本,项目的唯一标识由 groupId+artifactId+packaging+versionz 组成。 Dependency: 为了能够 build 或运行,一个典型的java project会依赖其他的包,在Maven中,这些被依赖的包就被称为 dependency。 Plug-in: Maven是有插件组织的,它的每一个功能都是由插件提供的,主要的插件是由 java 来写的,但是他也支持 beanshell 和 ant 脚本编写的插件。 Repository: 仓库用来存放artifact的,可以是本地仓库,也可以是远程仓库,Maven是由一个默认的仓库 Snapshot: 工程中可以(也应该)有这样一个特殊的版本:这个版本可以告诉Maven,该工程正在处于开发阶段,会经常更新(但还为发布)。当其他工程依赖此类型的artifact时,Maven会在仓库中寻找该artifact的最新版本,并自动下载、使用该最新版本。