将Java工具类转化为可执行jar包


在日常开发中,我们经常会编写各种Java工具类(如时间转换、数据加密、日志解析等),这些工具能帮我们解决重复工作,但每次通过IDE运行却很繁琐。本文就来分享如何将这些Java工具类标准化封装,使其成为像 lscurl一样可全局调用的Shell指令,提升开发效率。

一、通用化前提:让工具类具备“命令行友好”的特征

无论是什么工具类,要封装为Shell指令,需先保证它能通过命令行接收参数并输出结果,核心改造如下:

  1. 标准化入口:main方法的参数设计

    • 工具类必须包含 public static void main(String[] args)方法,作为命令行入口。
    • 参数通过 args数组接收(如时间转换工具的 待转换时间原格式目标格式);
  2. 输出规范化:结果与日志分离

    • 工具的核心结果(如转换后的时间、加密后的字符串)通过 System.out.println输出(方便Shell捕获结果,例如 result=$(timeconv ...));
    • 错误信息(如参数错误、格式异常)通过 System.err.println输出(避免干扰正常结果)。

二、将工具类打包为“可执行JAR”

JAR包是Java程序的标准分发格式,可执行JAR需指定 main方法所在的类,确保 java -jar能直接运行。

手动打包(适合简单工具)

  1. 编译工具类:javac ToolClass.java(生成 ToolClass.class);

  2. 创建 MANIFEST.MF文件(指定主类):

    Manifest-Version: 1.0
    Main-Class: ToolClass  # 工具类的全类名(若有包,需加包路径,如com.util.TimeConv)
  3. 打包为JAR:jar cvfm tool.jar MANIFEST.MF ToolClass.class

Maven/Gradle打包(适合复杂工具,推荐)

若工具依赖第三方库(如 commons-lang3),用构建工具自动处理依赖:

  1. 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>
  2. 执行打包:mvn package,在 target目录生成含所有依赖的“胖JAR”(如 timeconv-1.0-jar-with-dependencies.jar)。

三、通用问题排查:封装过程中常见坑点解决

  1. “找不到主类”错误

    • 检查JAR包的 MANIFEST.MFMain-Class是否正确(包名+类名是否完整);
    • 确保打包时包含了工具类的 .class文件(手动打包时注意路径,Maven打包需确认 src/main/java目录正确)。
  2. 依赖缺失(“找不到符号”)

    • 手动打包时,通过 java -cp "tool.jar:lib/*" 主类名补充依赖;
    • 推荐用Maven的 assembly插件打包“胖JAR”,一次性包含所有依赖。

四、总结:让工具类成为“基础设施”

通过以上流程,任何Java工具类都能被封装为Shell指令,从此告别“打开IDE运行工具”的低效方式。无论是个人日常开发,还是团队内部共享工具,这种方式都能显著提升效率——毕竟,好的工具就该像系统命令一样“随叫随到”。


评论
  目录