作者obelisk0114 (追风筝的孩子)
看板java
标题[问题] java 在 linux 上编译为 jar 并执行
时间Sun Mar 18 14:13:05 2018
之前都用 IDE 解决,现在突然需要用 jdk 编译
我有三个目录:
lib (放其他需要引用的 jar), 目前有 json-20180130.jar
rank (我的程式 package)
class (之後放产生的 class)
main function 在 MainRun.java
需要引用其他 jar 的程式引用: import org.json.*;
我编写的 MANIFEST.MF (放在相同目录) 和执行 script 有错误而执行失败
这是 MANIFEST.MF 的内容:
Manifest-Version: 1.0
Class-Path: . lib/json-20180130.jar
Main-Class: MainRun
这是 script 的内容:
javac -d class -cp ".:./lib/json-20180130.jar" rank/*.java
jar -cvfm rank.jar MANIFEST.MF class/*
java -jar rank.jar
请各位大大帮忙看一下哪边写错 ?
--
肝不好 ▁▁ ● ◤
肝若好
人生是黑白的 ▏ ◤
考卷是空白的
▏ ◤
、 ﹐
● ●b 囧 ▎ ●> ● ◤
▌ ﹍﹍ 0 ▊囧>
干...
▲ ■┘ ■ ▎ ■ █◤ ▌ ㄏ▋ ︶■
〈﹀ ∥ ▁▁∥ ▎ ﹀〉◤
▋ ▊ 〈\
ψcockroach727
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 47.149.227.123
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1521353594.A.483.html
1F:→ Killercat: 这种情况多半还是用mvn或者gradle build简单点吧.... 03/18 16:46
2F:→ AI3767: 执行script的错误讯息是? 03/19 01:13
added manifest
adding: class/rank/(in = 0) (out= 0)(stored 0%)
adding: class/rank/MainRun.class(in = 5683) (out= 3133)(deflated 44%)
...
Error: Could not find or load main class MainRun
※ 编辑: obelisk0114 (47.149.227.123), 03/19/2018 06:23:41
3F:→ ssccg: manifest中的class name要写rank.MainRun 03/19 09:10
4F:→ ssccg: 基本上java所有说到class name的都是指完整名称 03/19 09:10
还是有同样错误
目前结构:
class (预定放产生的 class)
rank (我的程式, main function 在 MainRun, 全部都有加 package rank;)
lib (外部 jar, 目前是 json-20180130.jar)
script
MANIFEST.MF
修改内容:
MANIFEST.MF
Class-Path: lib/json-20180130.jar
Main-Class: class.rank.MainRun
script
javac -d class -cp lib/json-20180130.jar rank/*.java
jar -cvfm rank.jar MANIFEST.MF class/* lib/*
※ 编辑: obelisk0114 (47.149.227.123), 03/19/2018 09:30:10
5F:→ ssccg: 是rank.MainRun,没有class. 03/19 09:38
Error: Could not find or load main class rank.MainRun
※ 编辑: obelisk0114 (47.149.227.123), 03/19/2018 09:46:22
6F:→ ssccg: jar -cvfm rank.jar MANIFEST.MF -C class . 03/19 11:05
7F:→ ssccg: jar档中的相对路径要跟package一致,要把class重新对应到 03/19 11:06
8F:→ ssccg: jar档中的根目录,你可以解开jar档确认一下 03/19 11:07
改用大大的指令 jar -cvfm rank.jar MANIFEST.MF -C class .
可以执行成功,但好像不会把 lib 里面的 jar 包进去
将打包好的 jar 放到别的目录就无法执行
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONArray
at rank.MainRun.main
...
Caused by: java.lang.ClassNotFoundException: org.json.JSONArray
...
※ 编辑: obelisk0114 (47.149.227.123), 03/19/2018 13:22:12
9F:→ ssccg: jar -cvfm rank.jar MANIFEST.MF -C class . lib/* 03/19 13:41
10F:→ ssccg: 我只是把你原本的 class/*换成-C class . (把class目录下全 03/19 13:42
11F:→ ssccg: 包进去且置换成根目录),其他你原本有的还是要有啊. 03/19 13:42
放到其他目录还是有相同错误, 不过已经有把那个 jar 包进去了
※ 编辑: obelisk0114 (47.149.227.123), 03/19/2018 14:27:39
12F:→ ssccg: 看来单纯把jar包进去是不行的,有些执行环境可以是因为用了 03/19 14:39
13F:→ ssccg: 特殊的classloader,你必须把lib jar内容解开一起包到你的 03/19 14:40
14F:→ ssccg: jar里面,或是就一样把lib jar也复制到你要执行的目录 03/19 14:41