zoukankan      html  css  js  c++  java
  • 自己查与写的批量比较bash

    前言:互测的时候一个一个输入感觉太麻烦,于是尝试写自己的对拍,又想到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: 文章里面或许有不足甚至错误的地方,还请各位霸霸直接指出!

  • 相关阅读:
    文件上传
    使用servlet+jdbc+MD5实现用户加密登录
    JDBC入门
    springmvc(三)
    springmvc(二)
    springmvc(一)
    JavaScript总结(一)
    Spring的AOP面向切面编程
    Spring框架(三)
    Spring框架(二)
  • 原文地址:https://www.cnblogs.com/CookieLau/p/10494232.html
Copyright © 2011-2022 走看看