在日常开发中,我们经常会编写各种Java工具类(如时间转换、数据加密、日志解析等),这些工具能帮我们解决重复工作,但每次通过IDE运行却很繁琐。本文就来分享如何将这些Java工具类标准化封装,使其成为像 ls
、curl
一样可全局调用的Shell指令,提升开发效率。
一、通用化前提:让工具类具备“命令行友好”的特征
无论是什么工具类,要封装为Shell指令,需先保证它能通过命令行接收参数并输出结果,核心改造如下:
-
标准化入口:
main
方法的参数设计- 工具类必须包含
public static void main(String[] args)
方法,作为命令行入口。 - 参数通过
args
数组接收(如时间转换工具的待转换时间
、原格式
、目标格式
);
- 工具类必须包含
-
输出规范化:结果与日志分离
- 工具的核心结果(如转换后的时间、加密后的字符串)通过
System.out.println
输出(方便Shell捕获结果,例如result=$(timeconv ...)
); - 错误信息(如参数错误、格式异常)通过
System.err.println
输出(避免干扰正常结果)。
- 工具的核心结果(如转换后的时间、加密后的字符串)通过
二、将工具类打包为“可执行JAR”
JAR包是Java程序的标准分发格式,可执行JAR需指定 main
方法所在的类,确保 java -jar
能直接运行。
手动打包(适合简单工具)
-
编译工具类:
javac ToolClass.java
(生成ToolClass.class
); -
创建
MANIFEST.MF
文件(指定主类):Manifest-Version: 1.0 Main-Class: ToolClass # 工具类的全类名(若有包,需加包路径,如com.util.TimeConv)
-
打包为JAR:
jar cvfm tool.jar MANIFEST.MF ToolClass.class
。
Maven/Gradle打包(适合复杂工具,推荐)
若工具依赖第三方库(如 commons-lang3
),用构建工具自动处理依赖:
-
在
pom.xml
中配置插件(以Maven为例):<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.4.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> <!-- 打包所有依赖 --> </descriptorRefs> <archive> <manifest> <mainClass>com.util.TimeConv</mainClass> <!-- 主类全路径 --> </manifest> </archive> </configuration> <executions> <execution> <phase>package</phase> <goals><goal>single</goal></goals> </execution> </executions> </plugin> </plugins> </build>
-
执行打包:
mvn package
,在target
目录生成含所有依赖的“胖JAR”(如timeconv-1.0-jar-with-dependencies.jar
)。
三、通用问题排查:封装过程中常见坑点解决
-
“找不到主类”错误
- 检查JAR包的
MANIFEST.MF
中Main-Class
是否正确(包名+类名是否完整); - 确保打包时包含了工具类的
.class
文件(手动打包时注意路径,Maven打包需确认src/main/java
目录正确)。
- 检查JAR包的
-
依赖缺失(“找不到符号”)
- 手动打包时,通过
java -cp "tool.jar:lib/*" 主类名
补充依赖; - 推荐用Maven的
assembly
插件打包“胖JAR”,一次性包含所有依赖。
- 手动打包时,通过
四、总结:让工具类成为“基础设施”
通过以上流程,任何Java工具类都能被封装为Shell指令,从此告别“打开IDE运行工具”的低效方式。无论是个人日常开发,还是团队内部共享工具,这种方式都能显著提升效率——毕竟,好的工具就该像系统命令一样“随叫随到”。