0x0000 前言
由于之前接触Java是一直玩的Android,或者上Java课时很简单的在Eclipse中写点小程序,现在接触了Java写后端程序,跟之前的做法有些大不一样了。项目编写完了,在IDEA中运行的倒好,导出却踩了不少坑。这里介绍三种Java工程的导出方法,记录一下。一般情况下,我们会使用Maven或者Gradle来创建并管理Java工程,当然也有原生的Java工程。
0x0001 普通Java项目
此种Java项目就是最基础的,没有用到任何项目管理工具或者仓库的。此种工程项目文件结构比较简单,但是导出需要自行配置。
进入File
->Project Structure
添加一个Artifacts
。 Artifacts
代表一个打包项目。
然后需要添加你所依赖的Jar文件,设置主类。
接下来,如果一切正常,你就可以通过Build->Build Artifacts
找到你刚刚创建的Artifacts
。
可以看到,现在可以选择Build
或者Rebuild
进行构建,也可以Clean
清除构建的jar包。
构建完成后,jar包会在项目的out/artifacts
目录下。上传到服务器,使用 java -jar xxxx.jar
命令运行即可。
0x0002 Maven项目
使用Maven构建的项目比较常见,如果你使用Spring或SpringBoot那么肯定会用到Maven。使用Maven构建的一大好处就是依赖配置非常方便,不用手动下载jar包,直接在pom.xml
中进行配置就行。
而使用Maven的工程构建导出jar包也比较容易。我们直接在IDEA中找到Maven窗口(一般在右边,如果你没有乱动过的话),选择package
进行构建。
使用Maven构建的jar会生成在项目的target
目录下。在服务器上运行方式同普通的java项目,使用jar命令即可。
0x0003 Gradle项目
如果你也开发Android,那么会比较熟悉Gradle,我们在Android中用到过。只不过Gradle导出Java项目和Android还是有很大区别。
这里介绍一种常用方法,通过Gradle插件Application
进行构建。如果想要其他方法的小伙伴也可以在网络上搜索资料。
我们需要在Gradle项目的配置文件,即build.gradle
中添加如下配置来启用Application插件并设置程序入口主类。
// 启用Application插件
apply plugin: 'application'
// 主类
mainClassName = 'com.xxx.xxx.Main'
设置完成后,我们便可以在IDEA的Gradle窗口中找到application->run
和distribution->assembieDist/distTar/distZip/installDist
了
这里介绍一下各个Task的不同之处:
- run: 在IDEA中运行项目
- distTar: 构建项目,生成一个Tar包 在项目的build/distributions
目录下
- distTar: 构建项目,生成一个Zip包 在项目的build/distributions
目录下
- assembieDist:构建项目,相当于同时执行了distTar
和distZip
- installDist: 构建项目,生成一个目录 在项目的build/install
目录下
我们可以看到,通过这种方式生成的工程是一个目录,包含了执行脚本和所有jar文件。项目的jar文件和引用到的jar包是分开的,因此需要执行脚本来启动。
- bin目录 包含两个执行脚本,.bat
脚本在Dos环境(windows)使用,无后缀的其实是.sh
脚本,在Unix环境运行
- lib目录 项目导出的jar和依赖的jar文件,注意他们是分开的
因此想要在Linux服务器上运行,我们可以使用distTar
导出一个Tar压缩包,在服务器上使用tar -xvf xxxx.tar
进行解压,然后进入bin目录,执行./xxxx
脚本即可。
0x0004 GBK编码的坑
如果使用IDEA进行开发,Gradle进行编译构建,有可能会报出这样的错误
错误: 编码GBK的不可映射字符
这是因为Gradle默认使用了GBK编码进行编译。而IDEA中是UTF-8编码,如果不是UTF-8编码可能也会出现乱码,所以强烈建议编程环境就使用UTF-8。
IDEA设置编码在File->Settings->Editor->File Encodings
中
然后我们需要在build.gradle
中添加如下配置,设置编码为UTF-8
// 使用UTF-8 编译
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
现在再进行构建就不会报错了。
Comments | NOTHING