前言:互测的时候一个一个输入感觉太麻烦,于是尝试写自己的对拍,又想到os刚学了bash命令行处理,于是想把两者结合一下减轻自己的工作量

分两步:

  • 将所有人的工程导出成jar文件
  • 放到linux下用bash同一处理

第一部分

.jar文件的打包,这一部分弄了有五六个小时,感觉最晕也查了很多资料,想给大家分享一下现成的东西减少时间的浪费。

1.简单打包:

遇到非常简单的单独java文件的时候

javac Main.java //compile the .java
jar cvfm Main.jar manf Main.class //package .class into .jar
java -jar Main.jar //test if .jar excutable

manf文件说明

manf相当于是windows中的 .ini说明文件,也可以见到别的帖子中有命名为 MANIFEST.MF 或 manifest.mf 的,但其实应该都没有关系,只要里面的语句是正确的即可,在打包的时候声明即可 其中常见常用的有: Main-Class: xxx 这是告诉 .jar 主函数入口在哪个文件里面,这里后面的xxx就是包含主函数main的xxx.java的名字不带扩展名。如在Polynomial.java中包含主函数入口main,则manf应该写成: Main-Class: Polynomial 此外,manf文件对内部的文字格式有着严格的要求 包括但不限于: 1. 冒号后面有且只有一个空格 2. 行末不能有多余空格 3. 文件最后有一行空行,即有字符的最后一行要敲回车

此外还有可能包含的语句: Class-Path: xxx.jar 这是在文件引用了已有的jar包的时候需要在manf中添加的,同样需要保证冒号后面有且只有一个空格

2. 稍微复杂一点的打包

在主函数文件中或其他地方引用了根目录下的目录下的package

如结构:

  • Polynomial

    • test

      • test1.java
      • test2.java
    • Main.java

这个时候就要在每个文件夹中对所有要用到的 .java文件进行编译,然后再在Polynomial文件下面写好manf文件,并在命令行中将出现的 .class全部包括进来,具体的命令为:

//模拟命令行

- Polynomial> cd test
- test> javac test1.java
- test> javac test2.java
- test> cd ..
- Polynomial> javac Main.java
- Polynomial> TREE
- Polynomial
- test
- test1.java
- test1.class
- test2.java
- test2.java
- Main.java
- Main.class
- Polynomial> vim manf
- ........... //省略manf的编写
- Polynomial> jar cvfm Main.jar manf test/test1.class test/test2.class Main.class
- Polynomial> java -jar Main.jar //test if .jar excutable

cvfm等option具体含义如下:

    -c  创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-n 创建新档案后执行 Pack200 规范化
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用任何 ZIP 压缩
-P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含以下文件

解决同一个package中的相互依赖问题

  • 在javac一个java文件的时候因为里面用到了另外的.java导致出现找不到特别类的情况,这时候要加上一个 -cp参数,如果是自己主函数也在这个package里面就要cp到自己的父目录
  • 即:javac -cp .. Main.java
  • 其中 -cp 表示指定查找用户类文件和注释处理程序的位置,所以主函数在package内当然是查找自己的父目录,主函数和package文件夹并列的时候用 "." 不用 ".."

3. 另一种主函数在package中的情况

如树形结构:

- Polynomial //<Package>
- Main.java
- test1.java
- test2.java
- //三者都在package Polynomial中

此时用上方的调用方法失效,因为主函数入口也在package中,此时应该

  1. 在package中对每个 .java 编译出 .class
  2. 在package目录的同级写好manf文件,文件中Main-Class写为: package + "." + Main,如主函数在Main.java中,Main.java 在Polynomial的package中,就应该写:Main-Class: Polynomial.Main
  3. 然后再在Polynomial同级下运行cmd命令行:
    • jar cvfm Main.jar manf Polynomial
    • //注:最后的Polynomial参数会将该目录下的所有文件打包到jar中

第二部分

bash的编辑,在windows下肯定也有相应的指令,但是想着熟悉一下linux所以这部分是在linux下编写。

  1. 将打包好的 .jar文件全部放到一个文件夹内
  2. 编写my.sh,我写的部分如下:
#!/bin/bash
#excute .jar(s)
find . -name "*.txt" -exec rm -rf {} \;
touch archer.txt
touch assassin.txt
touch berserker.txt
touch caster.txt
touch lancer.txt
touch rider.txt
touch saber.txnalfint
echo $1 | java -jar archer.jar | sed -n "1p" >> archer.txt
echo $1 | java -jar assassin.jar | sed -n "1p" >> assassin.txt
echo $1 | java -jar berserker.jar | sed -n "1p" >> berserker.txt
echo $1 | java -jar caster.jar | sed -n "1p" >> caster.txt
echo $1 | java -jar lancer.jar | sed -n "1p" >> lancer.txt
echo $1 | java -jar rider.jar | sed -n "1p" >> rider.txt
echo $1 | java -jar saber.jar | sed -n "1p" >> saber.txt
diff -saBb archer.txt berserker.txt
diff -saBb assassin.txt berserker.txt
diff -saBb caster.txt berserker.txt
diff -saBb lancer.txt berserker.txt
diff -saBb rider.txt berserker.txt
diff -saBb saber.txt berserker.txt
//当然有很多可以优化的地方,比如直接用 > 覆盖文档,不用删了再加,或许可以直接多个处理对比什么的,但是我还没查到

部分解释: 第一行find是找到该目录下所有名字匹配 *.txt的文件并删除 第二部分是建立每个人的输出文档 第三部分是将第一个参数,也就是我们需要输入的一行用echo和管道传给java -jar执行,并将执行的结果用管道传给命令sed,经过sed可以只取

P.S. 用diff比较文件 常用参数:

-s 相同时仍输出
-b 忽略首部空格
-y 逐行比较
-B 忽略空行

nano常用功能: 自由赋值 Ctrl+6开始 Alt+6截至 Ctrl+U 粘贴

参考资料:

命令行打包jar: https://blog.csdn.net/whitenigt/article/details/80209472

jar instruction: https://www.jb51.net/article/43033.htm

nano instruction: https://www.cnblogs.com/nufangrensheng/p/3486018.html

Ending: 文章里面或许有不足甚至错误的地方,还请各位霸霸直接指出!

自己查与写的批量比较bash的更多相关文章

  1. 使用OpenCV读、操作、写图像并与bash合作对某个目录下所有图像进行类似处理

    我门要对某个目录下所有图像文件进行统一处理,如果图像的数量过多,那么手动地一张张处理就会显得有些麻烦.本文使用OpenCV和bash来完成我们指定的任务. 任务 将目录A下的所有统一格式的jpg图像变 ...

  2. 使用OpenCV读、操作、写图像并与bash合作对某个文件夹下全部图像进行相似处理

    我门要对某个文件夹下全部图像文件进行统一处理,假设图像的数量过多.那么手动地一张张处理就会显得有些麻烦.本文使用OpenCV和bash来完毕我们指定的任务. 任务 将文件夹A下的全部统一格式的jpg图 ...

  3. 用Python写的批量文件重命名

      有些时候下载图片或其他文件,文件名都怪怪的,可选的办法是下载一个文件批量重命名的软件.当然,如果想自己'DIY'一把的话编个Python脚本最好不过了. 下面的代码实现的对指定类型的文件进行批量重 ...

  4. Ajax写成绩批量录入

    1.jsp,ajax的循环调用,必须要递归,否则会出错. <%@ page language="java" import="java.util.*" pa ...

  5. Python写一个批量生成账号的函数

    批量生成账户信息,产生的账户由@sina.com结尾,长度由用户输入,产生多少条也由用户输入,用户名不能重复,用户名必须由大写字母.小写字母和数字组成. def Users(num,len): # n ...

  6. Android代码速查,写给新手的朋友们[转]

    原文地址:http://www.open-open.com/lib/view/open1397286499090.html 0 android 创建按钮 Button button = new But ...

  7. 写着玩的bash脚本

    #!/bin/bash function strealingManu { pwdfolder=`pwd` for var in "$@" do man 1 $var > $p ...

  8. python写端口批量扫描器

    用到shodan模块 话不多说,马上开始 pip3 install shodan import shodan SHODAN_API_KEY=" 你的shodankey" api = ...

  9. python写批量weblogic爆破脚本

    前言: 整理笔记的时候,发现了weblogic的攻击方法.心里打着算盘看看怎么写 个批量的弱口令爆破脚本.得出了以下思路 思路: 1.利用钟馗之眼采集weblogic的网站,将IP写入到txt 2.添 ...

随机推荐

  1. StartDT_AI_Lab | 开启“数据+算法”定义的新世界

    继「数据中台技术汇」栏目推出以来,获得了不少技术极客的喜爱.作为AI驱动的数据中台创导者,深度关注核心算法技术的自研创新.融合探索,故推出全新AI算法栏目「StartDT_AI_Lab」,主要介绍算法 ...

  2. SLIQ/SPRINT

    SLIQ/SPRINT */--> SLIQ/SPRINT Before SLIQ, most classification alogrithms have the problem that t ...

  3. [2015普及组-D]推销员 思维que

    题:https://www.cometoj.com/problem/0221 #include<iostream> #include<cstring> #include< ...

  4. python中字典以key排序,以value排序。以及通过value找key的方式

    1.sorted函数首先介绍sorted函数,sorted(iterable,key,reverse),sorted一共有iterable,key,reverse这三个参数. 其中iterable表示 ...

  5. Django ORM单表查询必会13条

    必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...

  6. 荼菜的iOS笔记--UIView的几个Block动画

    前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...

  7. async包 ES6 async/await的区别

    最基本的async 包 ApCollection.find({}).toArray(function (err, aps) { var num = 0; async.whilst( function ...

  8. PEAKS|NovoHMM|Nover|DeepNovo|MAYUPercolator|UniprotKB|Swiss-prot|Mascot|SEQUEST|X!Tandem|pFind|MaxQuant|Msconvert|PEPMASS|LC|

    质谱仪: 质谱分析法是先将大分子电离为带电粒子,按质核比分离,由质谱仪识别电信号得到质谱图. Top-down直接得到结果是蛋白. Bottom down使用shutgun方法得到结果是肽段. 由蛋白 ...

  9. C语言数据类型char

    char简介 char是C/C++中的基本数据类型,可容纳单个字符的一种基本数据类型. char占一个字节,也就是8个bit(二进制位),0000 0000 ~ 1111 1111,在无符号类型时ch ...

  10. MongoDB的初级安装和使用

    对于非关系型数据库,很多人不是很清楚,我也是作为新手慢慢摸索, 外网地址下载贼慢:我烦放在自己的百度网盘里 软件链接:https://pan.baidu.com/s/1A7h4VOfvm8N2gnlJ ...