[ 懶人神器 ] —— 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.pswp.cn/news/249147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249147.shtml
英文地址,請注明出處:http://en.pswp.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、…