今天编写了一个运行在服务端的java工具类,才发现自己以前很少关注运营方面的内容,导致在服务端部署一个java的工具变得异常困难,其实这也是自己对java的了解不够造成的。
首先,当代码编写完成之后,在主类中必须要有main函数,其中的参数非常重要。根据一位同事的说法,除正常的执行程序之外,其中至少要包含两种参数:-v(软件版本,以及作者等介绍信息),-h(软件的帮助信息,良好的帮助文档能够帮助使用本软件的人能够很容易地学会其基本用法)。
main函数编写完成后,需要在build的时候,指定对应的jar包中的主类型,本部分是用maven构建的,因此需要在pom文件中加入定义:
<build> <finalName>daily-report-transfer</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>Main Class Name</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
此后,build完之后的MANIFEST.MF文件中就会包含描述main的一行数据:
Main-Class: Main Class Name
java命令运行时,可以在没有写入Main-Class的时候,使用加入ClassPath的方式运行(其中windows下分隔符用;Linux和mac下分隔符为:):
java –cp 类路径;要执行的主类 参数...
如果写入的Main-Class,就可以直接使用java –jar 命令运行jar包中的主类,后面接具体的参数。
但是如果使用java –jar的方式运行,也就意味着不能够加入额外的-cp,即加入不了其他的jar包,如果项目中使用了其他的jar包该怎么办?这就需要将所有的依赖项加入到打好的jar包中。
在maven中,同样可以添加plugin标签内容来生成包含依赖jar包中类型的方法,使用如下的手段:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>Main Class Name</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
此时就会根据标签descriptorRef中的内容生成含依赖项的jar包,可以使用java –jar的方式运行。
在运行时,我们通常需要指定的运行文件路径为相对路径而非绝对路径,这就需要使用File的相关相对路径的方法,其实File对象本身就支持相对运行路径,但最好使用ClassLoader能够识别的文件路径,通过Class.getResourceAsStream的形式访问。
关于程序的输出,有三种形式,即system out, system err以及exit代码。在Linux系统中,程序的输出流有两种:正常输出以及异常输出,分别用1和2表示。即我们在执行一个linux命令时,如果没有指定对应的输出文件,就会将正常输出以及异常输出都输出至控制台Console中,可以使用>或>>的方式,将其输出至指定的文件,在输出时1>(或>>)会将java中system out的内容输出指定文件,2>(或>>)会将sytem err的内容输出至指定文件。
我们在java程序中当然可以System.setOut(...),System.setErr(...)的方式在程序中将输出流重置,这就相当于重置一个静态变量,这样所有的输出都会重置到这个流中。值得注意的是,一定要保留程序的异常堆栈,将其正常地输出至文件或者控制台中,以便查看问题。异常的输出方式不仅有e.printStackTrace()方法,这就相当于将错误堆栈输出到控制台中,可以通过e.printStackTrace(PrintStream)的方式定向到指定的输出流中。
我们都指定命令有返回值,通过$?的方式得到上个程序的返回值,在java中如何确定呢?这就要通过System.exit(返回值)的方式,注意这句话要在程序运行完成时才能调用,因为调用完成后,java虚拟机就会退出。
此外,尤其需要注意的是,我们的java程序可能会在多种平台下运行,了解一些关于系统的差异属性非常必要,这里System.getProperty就能够得到我们需要的一系列属性:
属性名称 |
含义 |
java.version |
运行时环境版本 |
java.vendor |
运行时环境供应商 |
java.vendor.url |
供应商url |
java.home |
java安装目录 |
java.vm.specification.version |
虚拟机规范版本 |
java.vm.specification.vendor |
虚拟机规范供应商 |
java.vm.specification.name |
虚拟机规范名称 |
java.vm.version |
虚拟机实现版本 |
java.vm.vendor |
虚拟机实现供应商 |
java.vm.name |
虚拟机实现名称 |
java.specification.version |
运行时环境版本 |
java.specification.vendor |
运行时环境规范供应商 |
java.specification.name |
运行时环境规范名称 |
java.class.version |
类格式版本号 |
java.class.path |
Java类路径 |
java.library.path |
加载库时搜索的路径列表 |
java.io.tmpdir |
默认的临时文件路径,在创建临时文件时会使用到 |
java.compiler |
使用的jit编译器名称 |
java.ext.dirs |
一个或多个扩展目录的路径 |
os.name |
操作系统名称 |
os.arch |
操作系统的架构 |
os.version |
操作系统版本 |
file.separator |
文件分隔符 |
path.separator |
路径分隔符(win是;linux是:) |
line.separator |
行分隔符 |
user.name |
用户的账户名称 |
user.home |
用户的主目录 |
user.dir |
用户当前的工作目录 |
这其中,又以最下面的几个属性最为有用,在编写跨平台的应用程序时,尤其注意控制文件分隔符,行分隔符等操作。下面是在本机(mac系统)中执行后的结果:
os_name:Mac OS X os_arch:x86_64 os_version:10.9.3 user_dir:/Users/xxx/develop/workspace/github/dailyreport-analyse java_vm_specification_version:1.0 java_vm_specification_vendor:Sun Microsystems Inc. java_vm_specification_name:Java Virtual Machine Specification java_vm_version:20.65-b04-462 java_vm_vendor:Apple Inc. java_vm_name:Java HotSpot(TM) 64-Bit Server VM java_ext_dirs:/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext file_separator:/ path_separator::
相关推荐
在命令行编译和运行Java程序时,正确设置`classpath`至关重要。`classpath`是JVM查找类和资源的目录列表。你可以通过以下方式设置`classpath`: - 在编译时使用`-classpath`或`-cp`选项: ``` javac -classpath ...
10. **实例30**:作为压轴示例,通常会综合前面的知识点,可能是构建一个小型应用或系统,比如一个简单的命令行计算器或者数据库连接示例,展示如何将Java的各个部分整合在一起。 通过学习这些实例,Java初学者可以...
在学习大数据技术的过程中,Java是必不可少的基础语言之一。...在学习Java时,理解并掌握这些基础知识对于编写和调试程序至关重要,尤其在大数据领域,扎实的Java基础能够为处理大规模数据提供坚实的支持。
Java是一种广泛使用的面向对象的编程语言,其丰富的库和框架使得开发者可以高效地构建各种类型的应用程序,从简单的命令行工具到复杂的Web和移动应用。"java常用各种架包"这个压缩包文件集合了Java开发中常用的库和...
Java设计之初的目标是“一次编写,到处运行”,这得益于其强大的跨平台能力,即编译后的Java程序可以在任何安装了Java虚拟机(JVM)的设备上运行,无需重新编译。 ### Java小程序代码与.class文件 #### 核心概念:...
一旦生成,运行 JavaCC 解析器所需的只是一个 Java 运行时环境 (JRE)。本 README 旨在简要概述核心功能以及如何设置以开始使用 JavaCC。有关完整详细文档,请参阅https://javacc.github.io/javacc/。内容介绍特征一...
此外,JDK(Java Development Kit)是必需的,它包含了编译、调试和运行Java程序所需的所有工具。 6. **Java性能调优**:由于提到在Linux环境下效果最好,可能意味着代码中包含了针对Linux系统的性能优化技巧,如...
ANT是一种开源的、强大的Java构建工具,它使用XML来描述构建过程中的各种任务。要获取ANT,请访问以下网址下载并安装:http://ant.apache.org/。 安装ANT的具体步骤如下: - 访问上述网址下载最新版本的ANT压缩包。...
在本案例中,`README.txt`可能包含了关于`main.java`代码的简要说明、运行指南或其他重要提示。 学习Java编程,还需要理解以下核心概念: 1. **类与对象**:Java是面向对象的,所有的数据和功能都被封装在类中,而...
2. **环境配置**:学习如何安装JDK(Java Development Kit),设置环境变量,以及使用命令行工具如`javac`和`java`来编译和运行Java程序。 3. **基本语法**:涵盖变量、数据类型、运算符、控制流程(if语句、switch...
在Java编程语言中,"fffff"可能是一个项目或功能的特定标识,但由于具体细节未给出,我们将聚焦于Java代码的基础知识以及一个典型的Java项目结构。以下内容将围绕这个主题展开。 1. **Java简介**:Java是一种面向...
4. **运行指南**:提供运行程序的命令行指令。 5. **测试**:如果有的话,会说明测试框架和如何运行测试。 6. **许可证信息**:指出项目的开源许可证类型,如MIT、Apache 2.0等。 7. **贡献指南**:对于开源项目,...
Java编程语言是软件开发领域广泛使用...通过这个简单的示例,你不仅学会了如何编写和运行Java程序,还对Java的基本语法和执行流程有了初步了解。随着经验的增长,你可以利用Java的强大功能来构建复杂的系统和应用程序。
在Java项目中,它可能解释了如何使用`mvn`或`gradle`构建工具来编译和运行代码,如何配置环境变量,或者提供了程序的使用示例。 除此之外,学习和理解Java代码还需要掌握相关的开发工具,如IntelliJ IDEA或Eclipse ...
4. **运行打包任务**: 在命令行中运行`gradle izpack`命令,Gradle会自动执行相关逻辑,生成Izpack安装包。 5. **测试安装包**: 最后,确保生成的安装包能在目标平台上正常运行,验证安装过程符合预期。 通过以上...
Java解析ASN.1文件的实例和简要使用说明主要涉及两个关键点:Java解析库JAC(Java ASN.1 Compiler)以及ASN.1语言的基本概念和应用。首先,ASN.1(Abstract Syntax Notation One)是一种标准的数据表示语法,常用于...
在`README.txt`中,你可能会找到如何设置开发环境、运行`main.java`的命令行指令,或者关于代码实现的一些简要说明。 要运行`main.java`,首先需要确保你有Java Development Kit (JDK) 安装,并配置好环境变量。...
"README.txt"可能是对这个Java代码的简要说明,包括如何构建、运行或测试这些代码,以及可能的依赖库和作者信息。通常,开发者会在这里写明如何通过命令行来执行`main`方法,例如: ```bash javac Main.java # 编译...
在Java项目中,`README`文件通常会提供如何构建和运行项目的简要指南,例如使用Maven或Gradle这样的构建工具,或者如何通过命令行来执行`main.java`中的主方法。 从“代码”这一标签我们可以推测,这个压缩包是关于...