日常开发过程中将一些频繁操作进行自动化脚本处理,可以做到事半功倍。把时间花费到重要的事情上面。最近进行项目自动化处理,写了一个java swing的工具,开发过程中遇到的问题记录如下。

首先介绍下如何将java程序打成可执行的jar

方式1 eclipse ide
方式2 IntelliJ ide

早期用eclipse进行可执行jar打包,最近使用intelJ 打包。这里介绍intelJ ide简单打包方式。

用到ide版本: IntelliJ IDEA Educational Edition 2019.3 x64

如图

Android jar 脚本自动化实践,可视化java swing工具_jar


File–>projectStructure -->Artifacts–>JAR–>From modules with dependenties

Android jar 脚本自动化实践,可视化java swing工具_jar_02


选择打入jar的module文件夹,选择启动主类,也就是程序的入口main()函数的类。点击确定

然后build jar

Android jar 脚本自动化实践,可视化java swing工具_jar_03

查看可执行jar包输出位置。

Android jar 脚本自动化实践,可视化java swing工具_jar_04


步骤2.

进入cmd窗口。验证

Android jar 脚本自动化实践,可视化java swing工具_java_05

不出意外的话,命令就可以执行了。如果是java swing写的jar。就会打开swing窗口了。

步骤3

开发过程中遇到需要对jar包中文件进行替换的操作。方案采用jar脚本进行修改。

Android jar 脚本自动化实践,可视化java swing工具_jar包_06

命令1.替换jar包中文件夹

jar uvf xxxx.jar jar包中文件夹/

tip: 命令1替换为全部替换,并不会替换单个文件。比如jar包中有test文件夹,包含1,2,3,4 文件。 如果替换 test文件内的某一个文件,需要在同级目录建立test文件夹并且包含 1,2,3,4文件。否则,会用外部同级test替换jar中test。外部test包含 1,2,替换之后jar包中test文件夹中的1,2,3,4 文件会被替换为1,2。

命令2 替换jar包中嵌套文件jar

jar uvf xxxx.jar jar包中文件夹/嵌套文件夹/

tips:层级目录一定要一致。

命令3 将某文件夹下的文件打入jar包目录下。层级不需要一致
jar uf xxx.jar -C 需要打入jar目录下的文件路径 . (最后面是一个点 .)

以上命令在cmd窗口中执行没有问题,如果使用java程序进行运行,效果还不一致。如下一个执行cmd命令的jar类。

public static int ececute(String cmd,boolean isNeedPrint)
{
Process proc = null;
int result = -1;
try {
List<StreamReader> list = new ArrayList<StreamReader>();
proc = Runtime.getRuntime().exec(cmd);
StreamReader error = new StreamReader(proc.getErrorStream(), "Error");
StreamReader output = new StreamReader(proc.getInputStream(), "Output");

if (isNeedPrint) {

list.add(error);
list.add(error);
}

error.start();
output.start();
if (isNeedPrint) {
for (StreamReader sr : list) {
sr.join();
}
}
result = proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
proc.destroy();
}

return result;
}
package panel;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamReader extends Thread
{

InputStream is;

String type;

StreamReader(InputStream is, String type)
{
this.is = is;
this.type = type;
}

public void run()
{
InputStreamReader isr = null;
BufferedReader br = null;
try
{
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
{
System.out.println(line);
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
finally
{
close(isr, br);
}
}

public void close(InputStreamReader isr, BufferedReader br)
{
if (null != br)
{
try
{
br.close();
}
catch (IOException e)
{
br = null;
}
}

if (null != isr)
{
try
{
isr.close();
}
catch (IOException e)
{
isr = null;
}
}
}

}

tips 。使用命令 jar uvf xxxx.jar -C 文件路径\路径\ ,会导致jar中自动生成的mete-info 被忽略,测试了下被忽略后没有影响,依然可以正常使用。

如图

Android jar 脚本自动化实践,可视化java swing工具_java_07

整理:

通过几天研究,了解java swing机制,通过将命令行界面化提供给非开发人员使用,学习成本更低。了解了jar 脚本的使用方法。将一些需要收到频繁操作步骤改成界面方式一键处理,大大提高了效率。解放了双手。

成品

Android jar 脚本自动化实践,可视化java swing工具_jar包_08

Android jar 脚本自动化实践,可视化java swing工具_jar包_09

看似简单处理,将过去需要通过手动调整配置文件,改为自动。一次大概可以省下来十多分钟,对于频繁出包改配置操作,可想而知。