[ 懒人神器 ] —— OO一键build:.zip - .jar

懒人神器


更新

大家注意一下,由于在写入MANIFEST的时候,Class-Path路径给的是 ../lib ,即上级目录的lib。 所以在对拍时如果手动移动了 jar包的位置,需要保证 lib/ 文件夹在存放jar包的上一级目录下,否则在运行时会报错 ClassNotFound

(也可以在源码中直接修改jar包的输出位置)

一种可能的文件树如下:

├──src
│  ├─ Archer.jar
│  ├─ Berserker.jar
│  ├─ Caster.jar
|  ├─ ....
|  └─ Alterego.jar
├──lib
│  ├─ elevator-input-hw3-1.4-jar-with-dependencies.jar
│  └─ timable-output-1.1-raw-jar-with-dependencies.jar
└──your_pat.py

一键build:zip -> jar
由于每次互测都要经过重复的操作:

download -> unzip -> compile -> run

本着一懒到底的原则,以及想要进一步熟悉一下shell指令,写了一个builder的脚本。

自己留着没意思,就拿出来分享给大家了,慢慢享用。

同时要感谢一下 fmh,过程中帮我解决了许多问题,还有 lqq 以身试法帮我测试~

使用

  • pre
    • 将所有下载的zip压缩包(java源文件)放入src文件夹中
    • 将本次作业的两个官方接口(外部jar包)放入lib文件夹中
    • 2. 中,更改相应的lib文件的绝对路径
  • 保证最后文件目录树如下即可:
├──src
│  ├─ Archer.zip
│  ├─ Berserker.zip
│  ├─ Caster.zip
|  ├─ ....
|  └─ Alterego.zip
├──lib
│  ├─ elevator-input-hw3-1.4-jar-with-dependencies.jar
│  └─ timable-output-1.1-raw-jar-with-dependencies.jar
└──builder.sh
  • run
    • 运行 builder.sh
  • 然后就可以愉快地开始对拍啦

  • 注意如果有player上交的src文件有多个main入口,有可能会出错。(但同样的,如果上交文件包含有多个入口,官方评测可能也过不了,这也是为什么rules中规定只能有一个入口)

实现思路

1. 解压缩并将lib中的外部包导入相应目录内

easy

2. 将src文件夹下的java编译为class文件

  • 编译输出路径为player/out/
  • 注意 lib中的 -classpath 为绝对路径

3. 将*.class打包成jar

  • 难点(坑点) 在于MANIFEST.mf 的写入
    1. 保证 Main-Class: 带有相应的包路径 ,如 elevator3.Main
    2. 保证 Class-Path: 为相对路径
    3. 保证文件后有两个空行。
  • 因此,为满足上述需求:
    • 由于.class为二进制文件,无法直接解析,但out文件夹下的.class文件结构与.java相同,故可以通过grep检索.java文件,得到Main类包路径,再对得到的路径进行标准格式化操作即可。
    • 相对路径: .表示当前路径;..表示上一目录的路径
    • 需要有空行是真的坑,差点自闭···

源码

#!/bin/bash# Pre-Condition: 
# NOTHING# Attention:
# *.zip will be deleted# Procedure:
# 1. put all *.zip into the src/ folder
# 2. put the external .jar into lib/ folder
# 3. run './builder.sh' 
# 4. the jar-files has been generated in the 'out' folder of the corresponding directory, enjoy!# file-tree is as follows:
# dir
#  ├──src
#  ├──lib
#  └──builder.shcd src/
# 1. unzip and copy lib/ to src/
echo unzip start...ls *.zip > temp.txt
sed 's/.zip//g' temp.txt > names.txt # sed 's/src/dst/'
names=`cat names.txt`   # attention# echo $names
for name in ${names[@]}
domkdir $nameunzip $name.zip -d $namecp -a ../lib $name
donerm *.txt
rm *.zip
echo unzip successfully...# 2. compile to class
echo complie start...prefix="javac -encoding utf-8 -d out/ @srcpath.txt "
lib="-classpath /C/Users/94831/Desktop/CourseCenter/OO/testShell/lib/elevator-input-hw3-1.4-jar-with-dependencies.jar:/C/Users/94831/Desktop/CourseCenter/OO/testShell/lib/timable-output-1.1-raw-jar-with-dependencies.jar "
command=${prefix}${lib}dirs=`ls`
echo $dirsfor dir in ${dirs[@]}
do# echo $dircd $dirmkdir outfind -name "*.java" > srcpath.txt$command# rm srcpath.txtcd ..
doneecho compile successfully...# 3. pack to jar
echo packing to jar...for dir in ${dirs[@]}
doecho $dircd $dir# write config information to MANIFEST.mfecho -n 'Main-Class: ' > MANIFEST.mfgrep -l "public static void main" . -r | sed s/\\.\\///g | sed s/src\\///g | sed s/\\.java//g | sed s/\\//./g >> MANIFEST.mfsed '2, $d' MANIFEST.mf | tee MANIFEST.mfecho 'Class-Path: ../lib/elevator-input-hw3-1.4-jar-with-dependencies.jar ../lib/timable-output-1.1-raw-jar-with-dependencies.jar' >> MANIFEST.mfecho >> MANIFEST.mfmv MANIFEST.mf outcd outfind -name "*.class" > classpath.txtjar cvfm $dir.jar MANIFEST.mf @classpath.txtcd ..   # from outcd ..   # from player_dir
doneecho pack successfully...

如有问题,欢迎留言交流!

转载于:https://www.cnblogs.com/puzzledAtticus/p/10717183.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现Datagrid分页

Html页面&#xff1a; <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title></title><meta charset"utf-8" /><!-- 引入相关CSS --><…

Luogu 3698 [CQOI2017]小Q的棋盘

BZOJ 4813 虽然数据范围很迷人&#xff0c;但是想树形$dp$没有前途。 先发现一个事情&#xff0c;就是我们可以先选择一条链&#xff0c;最后要走到这一条链上不回来&#xff0c;走到链上的点每一个只需要一步&#xff0c;而如果要走这条链之外的点&#xff0c;一个点需要走两步…

h5-plus.webview

这里是链接转载于:https://www.cnblogs.com/yuners/p/10721163.html

解决vue打包后静态资源路径错误的问题

vue项目完成的最后一步就是打包部署上线&#xff0c;但是打包部署的过程往往不是那么一帆风顺的&#xff0c;现将遇到问题和解决方案记录如下。 图片路径问题 起因&#xff1a; 页面中引入资源的方式往往有如下几种 * HTML标签中直接引入图片&#xff0c; 如 <img src&qu…

SQL语句01

SQL(Structured Query Language)&#xff1a;结构化查询语言SQL分类&#xff1a; 数据操纵语言DML&#xff08;Data Manipulation Language&#xff09; SELECT INSERT UPDATE DELETE 数据定义语言DDL&#xff08;Data definition language&#xff09; …

mongoose 笔记

快速启动 首先需要安装MongoDB和Node.js。 然后使用npm下载mongoose&#xff1a; npm install mongoose 接着我们直接在项目中引入mongoose&#xff0c;并且连接数据库就会在本地运行 MongoDB了&#xff1a; // index.js var mongoose require(mongoose); mongoose.connect(…

前端DES加密

1、下载crypto.js文件库 https://github.com/brix/crypto-js/releases 2、引入文件 <script type"text/javascript" src"js/jquery.min.js"></script> <script src"js/rollups/tripledes.js"></script> <script src&…

DOMBOM(source、methods、contents、Application)

何为DOM&#xff1f; Document Object Model Dom&#xff0c;是W3C组织推荐的处理可扩展标志语言的标准编程接口。在网页上&#xff0c;组织页面的对象被组织在一个树形结构中&#xff0c;用来表示文档中对象的标准模型就称为DOM。 可以认为DOM是页面上数据和结构的一个树形表示…

sublime 无法下载插件解决办法(亲测有效)

最近发现sublime装不到插件 只需要在Preferences > Package Settings > Package Control > Settings - User页面加上以下代码即可&#xff1a; "channels":["https://erhan.in/channel_v3.json"]上述频道亲测有效&#xff0c;如果还不能使用的小…

ES命令

基础概念 Elasticsearch有几个核心概念。从一开始理解这些概念会对整个学习过程有莫大的帮助。 接近实时&#xff08;NRT&#xff09; Elasticsearch是一个接近实时的搜索平台。这意味着&#xff0c;从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟&#xff…

Bug : Bash on Ubuntu on Windows scp work on window but not in shell file

&#xff1a; No Permission转载于:https://www.cnblogs.com/rgqancy/p/10726154.html

图片做背景撑开div

需求点&#xff1a; 设计师给了一张超大背景图&#xff0c;需要做一个不知道大小广告位&#xff0c;要求就是要把图片撑满整个页面&#xff0c;而且还得保证自适应。 解决方案一 &#xff08;亲测有效&#xff09; HTML代码&#xff1a; <div class"wrap">…

十一、jQuery的基本用法

初步接触不是很习惯&#xff0c;之前都是用的js&#xff0c;但是jQuery去掉了js很多繁琐的内容&#xff0c;用的不是很熟&#xff0c;所以先简单的记录一下&#xff0c;后续在继续补充 jq获取html内容: $("#id") 获取id $(".class") class名 …

spring-注解---IOC(3)

spring--注解---IOC(3) package com.zwj.bean;public class Blue {public Blue(){System.out.println("blue...constructor");}public void init(){System.out.println("blue...init...");}public void detory(){System.out.println("blue...detory..…

绝对定位的div图片居中自适应

需求点 固定定位div中添加图片内容&#xff0c;保证图片垂直居中&#xff0c;并且自适应。 一般在第三方UI组件中&#xff0c;这种布局需求较为常见 解决方案一 &#xff08;亲测有效&#xff09; HTML代码&#xff1a; <div class"el-carousel__item is-active is…

英语进阶系列-A06-本周总结

本周总结 目录Content 英语进阶系列-A01-再别康桥 英语进阶系列-A02-英语学习的奥秘 英语进阶系列-A03-英语升级练习一 英语进阶系列-A04-英语升级练习二 英语进阶系列-A05-英语升级练习三 古诗Poem 再别康桥 回乡偶书 梅花 劝学 游子吟 词汇Vocabulary be; have; give; get; t…

在div中设置文字与内部div垂直居中

要实现如图一所示的结果&#xff1a; html代码如下&#xff1a; <!DOCTYPE html> <html><head lang"zh"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta charset"utf-8" /><title>商…

王之泰201771010131《面向对象程序设计(java)》第九周学习总结

第一部分&#xff1a;理论知识学习部分 第7章异常、日志、断言和调试 概念&#xff1a;异常、异常类型、异常声明、异常抛出、 异常捕获1.异常处理技术2.断言的概念及使用3.基本的调试技巧 1&#xff09;异常的概念 a.Java的异常处理机制可以控制程序从错误产生的 位置转移到能…

vue移动端UI框架——Vant全局引入vs局部引入

全局引入 1.在main.js中全局引入全部vant组件 优点&#xff1a;可以在所有vue文件的template中定义所需组件缺点&#xff1a;打包发布时会增加包的大小&#xff0c;Vue的SPA首屏打开时本来就有些慢&#xff0c;同时不能在js中使用类似Toast功能的组件 代码如下&#xff1a; …

大前端完整学习路线(完整版),路线完整版

第一阶段&#xff1a; HTMLCSS: HTML进阶、CSS进阶、divcss布局、HTMLcss整站开发、 JavaScript基础&#xff1a; Js基础教程、js内置对象常用方法、常见DOM树操作大全、ECMAscript、DOM、BOM、定时器和焦点图。 JS基本特效&#xff1a; 常见特效、例如&#xff1a;tab、…