(3)创建Hello.java,并编译
在 F:\Example_Project\jar包内含有jar包 目录下创建com.Hello.java,Hello中调用了Student
package com; import edu.hncj.vip.Student; class Hello{ public static void main(String[] agrs){ //System.out.println("hello"); Student.speak(); } }
编译Hello.java文件,javac -d . -encoding UTF-8 com/Hello.java
F:\Example_Project\jar包内含有jar包>javac -d . -encoding UTF-8 com/Hello.java
生成hello.jar包,jar -cvf hello.jar com\ lib\
F:\Example_Project\jar包内含有jar包>jar -cvf hello.jar com\ lib\ 已添加清单 正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%) 正在添加: com/Hello.class(输入 = 310) (输出 = 237)(压缩了 23%) 正在添加: com/Hello.java(输入 = 175) (输出 = 138)(压缩了 21%) 正在添加: lib/(输入 = 0) (输出 = 0)(存储了 0%) 正在添加: lib/student.jar(输入 = 1179) (输出 = 790)(压缩了 32%)
(4)运行hello.jar,java -cp hello.jar com.Hello
F:\Example_Project\jar包内含有jar包>java -cp hello.jar com.Hello Exception in thread "main" java.lang.NoClassDefFoundError: edu/hncj/vip/Student at com.Hello.main(Hello.java:6) Caused by: java.lang.ClassNotFoundException: edu.hncj.vip.Student at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more
修改hello.jar中的MANIFEST.MF文件
Manifest-Version: 1.0 Created-By: 1.8.0_181 (Oracle Corporation) Class-Path: lib/student.jar
再次运行java -cp hello.jar com.Hello即可
6.读取jar外的配置文件
(1)在F:\Example_Project\读取jar外的文件 目录中创建Hello.java
Hello.java文件
import java.io.InputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.FileInputStream; class Hello{ public static void main(String[] args) throws Exception{ Hello hello = new Hello(); InputStream is = new FileInputStream("jarconf.txt"); print(is); } /** * 读取文件,输出里面的内容,通用方法 */ public static void print(InputStream inputStream) throws Exception { InputStreamReader reader = new InputStreamReader(inputStream, "utf-8"); BufferedReader br = new BufferedReader(reader); String s = ""; while ((s = br.readLine()) != null) System.out.println(s); inputStream.close(); } }
(2)同级目录下创建jarconf.txt文本文件,内容如下:
calssname=vip desc=这是一个外部配置文件
(3)编译并打包java文件 :
编译Hello.java文件
javac -encoding UTF-8 Hello.java
打包hello.jar文件 :
jar -cvf hello.jar Hello.class
修改META-INF\MANIFEST.MF文件添加
Manifest-Version: 1.0 Created-By: 1.8.0_181 (Oracle Corporation) Main-Class: Hello
执行jar:java -jar hello.jar
完整代码如下:
# 编译Hello.java文件为class文件 F:\Example_Project\读取jar内的文 件>javac -encoding UTF-8 Hello.java # 生成jar包, F:\Example_Project\读取jar外的文 件>jar -cvf hello.jar Hello.class 已添加清单 正在添加: Hello.class(输入 = 1008) (输出 = 594)(压缩了 41%) # 修改hello.jar中的META-INF\MANIFEST.MF # 执行jar F:\Example_Project\读取jar外的文 件>java -jar hello.jar calssname=vip desc=这是一个外部配置文件 此时的目录结构 F:\Example_Project\读取jar外的文 件>tree . /f /a 卷 工作 的文件夹 PATH 列表 卷序列号为 00000001 5296:88B3 F:\EXAMPLE_PROJECT\读取JAR外的文 件 | Hello.class | hello.jar | Hello.java | jarconf.txt | \---META-INF MANIFEST.MF
7.读取jar内的配置文件
(1)在F:\Example_Project\读取jar内的文件中创建Hello.java
Hello.java文件
import java.io.InputStream; import java.io.BufferedReader; import java.io.InputStreamReader; class Hello{ public static void main(String[] args) throws Exception{ Hello hello = new Hello(); InputStream is = hello.getClass().getResourceAsStream("jarconf.txt"); print(is); } /** * 读取文件,输出里面的内容,通用方法 */ public static void print(InputStream inputStream) throws Exception { InputStreamReader reader = new InputStreamReader(inputStream, "utf-8"); BufferedReader br = new BufferedReader(reader); String s = ""; while ((s = br.readLine()) != null) System.out.println(s); inputStream.close(); } }
同级目录下创建jarconf.txt文本文件,内容如下:
calssname=vip desc=这是一个内部配置文件
(2)编译并打成jar包
编译java文件 :
javac -encoding UTF-8 Hello.java
打包class文件 :
jar -cvfm hello.jar META-INF\MANIFEST.MF .
执行jar:
java -jar hello.jar
(3)完整过程如下:
# 编译Hello.java文件为class文件 F:\Example_Project\读取jar内的文件>javac -encoding UTF-8 Hello.java # 生成jar包,同时制定META-INF\MANIFEST.MF F:\Example_Project\读取jar内的文件>jar -cvfm hello.jar META-INF\MANIFEST.MF . 已添加清单 正在添加: Hello.class(输入 = 1109) (输出 = 637)(压缩了 42%) 正在添加: Hello.java(输入 = 755) (输出 = 385)(压缩了 49%) 正在添加: jarconf.txt(输入 = 50) (输出 = 55)(压缩了 -10%) 正在忽略条目META-INF/ 正在忽略条目META-INF/MANIFEST.MF # 执行hello.jar F:\Example_Project\读取jar内的文 件>java -jar hello.jar calssname=vip desc=这是一个内部配置文件
2.Maven专题
2.1Maven简介
Maven是一种构建工具(打包项目)、依赖管理工具(资源依赖管理工具:主要用于集成资源)、项目信息聚合工具。
2.2Maven安装与常用配置
(1)安装过程
最简安装:
选择版本 下载解压 配置MAVEN_HOME环境变量 通过mvn -version确定下版本
这种安装没有修改setting.xml,会导致Maven下载的依赖位于C盘,并且默认从中央仓库下载,可能网速慢一些,这时可修改如下配置:
打开D:\安装目录\maven\conf\settings.xml文件,查找修改如下配置:
<!-- 修改本地仓库位置 --> <localRepository>d:/apache/maven/maven-repo</localRepository> <!-- 修改镜像地址 --> <mirrors> <!-- 给定仓库的下载镜像。 --> <mirror> <!-- 该镜像的唯一标识符。id用来区分不同的mirror元素。 --> <id>nexus-aliyun</id> <!-- 被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓库的id central完全一致。 --> <mirrorOf>*,!jeecg,!jeecg-snapshots,!getui-nexus</mirrorOf> <!-- 镜像名称 --> <name>Nexus aliyun</name> <!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 --> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors> <repositories> <!--包含需要连接到远程仓库的信息 --> <repository> <!--远程仓库唯一标识 --> <id>codehausSnapshots</id> <!--远程仓库名称 --> <name>Codehaus Snapshots</name> <!--如何处理远程仓库里发布版本的下载 --> <releases> <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 --> <enabled>false</enabled> <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 --> <updatePolicy>always</updatePolicy> <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。 --> <checksumPolicy>warn</checksumPolicy> </releases> <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 --> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <!--远程仓库URL,按protocol://hostname/path形式 --> <url>http://snapshots.maven.codehaus.org/maven2</url> <!--用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 --> <layout>default</layout> </repository> </repositories>
2.3Maven工程简介
1.创建Maven工程
我们可以通过在命令行创建Maven工程,也可以通过IDEA创建Maven工程。打开命令行窗口,跳转到 D:\maven 目录,执行以下 mvn 命令。
mvn archetype:generate -DgroupId=edu.hncj -DartifactId=helloMaven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
参数说明:
DgroupId: 项目组 ID,通常为组织名或公司网址的反写。 DartifactId: 项目名。 DarchetypeArtifactId: 指定 ArchetypeId,maven-archetype-quickstart 用于快速创建一个简单的 Maven 项目。 DinteractiveMode: 是否使用交互模式。
需要注意的是,每个Maven工程都需要有一个唯一的定位坐标,即上述的GAV(groupId: 项目组 ID,DartifactId: 项目名, Version 唯一发行版本号)
2.Maven工程目录
工程结构:约定优于配置
约定优于配置(Convention Over Configuration)是 Maven 最核心的涉及理念之一 ,Maven对项目的目录结构、测试用例命名方式等内容都做了规定,凡是使用 Maven 管理的项目都必须遵守这些规则。
Maven 项目构建过程中,会自动创建默认项目结构,开发人员仅需要在相应目录结构下放置相应的文件即可。
例如,下表显示了项目源代码文件,资源文件和其他配置在 Maven 项目中的默认位置。
文件 目录 Java 源代码 src/main/java 资源文件 src/main/resources 测试源代码 src/test/java 测试资源文件 src/test/resources 打包输出文件 target 编译输出文件 target/classes
2.4Maven常用命令
1、mvn compile 编译,将Java 源程序编译成 class 字节码文件。 2、mvn test 测试,并生成测试报告 3、mvn clean 将以前编译得到的旧的 class 字节码文件删除 4、mvn pakage 打包,动态 web工程打 war包,Java工程打 jar 包。 5、mvn install 将项目生成 jar 包放在仓库中,以便别的模块调用