[英]jar from Main.class creation: no main manifest attribute, in jar
我需要创建一个 jar 文件而不是使用 maven 或 gradle 包。
首先 - 我使用了我在 StackOverflow 中看到的所有选项,所以如果你不确定你会找到的解决方案,请不要将这个问题标记为duplicated
- 我已经尝试过更多的解决方案。
项目结构:
\src
---\Main.java
---\A.java
---\B.java
步骤:
1.编译:
javac \src\*.java
\src
---\Main.class
---\A.class
---\B.class
2. 清单文件创建:
Manifest-Version: 1.0
Main-Class: src.Main
3.编译到jar:
jar cfm test.jar MANIFEST.MF src/
4.发射:
java -jar test.jar
结果:
test.jar 中没有主要清单属性
我也在尝试以下:
jar cvfe myjar.jar src.Main src\*.class
和许多其他选项 - 相同的结果
如何在本地正确创建 jar 文件?
DemoApp
├── MANIFEST.MF
└── src
├── A.java
├── B.java
└── Main.java
Manifest-Version: 1.0
Main-Class: Main
无包裹
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
System.out.println(new A().hello("WORLD"));
System.out.println(new B().echo(Calendar.getInstance().getTime().toString()));
}
}
javac src/*.java -d out
DemoApp
└── out
├── A.class
├── B.class
└── Main.class
cp MANIFEST.MF out/
DemoApp
└── out
├── A.class
├── B.class
├── Main.class
└── MANIFEST.MF
cd out
jar cfm ../app.jar MANIFEST.MF *.class
cd ..
DemoApp
├── app.jar
├── MANIFEST.MF
├── out
│ ├── A.class
│ ├── B.class
│ ├── Main.class
│ └── MANIFEST.MF
└── src
├── A.java
├── B.java
└── Main.java
java -jar app.jar
app.jar
├── A.class
├── B.class
├── Main.class
└── META-INF
└── MANIFEST.MF
DemoApp
└── src
├── A.java
├── B.java
└── Main.java
javac src/*.java -d out
DemoApp
├── out
│ ├── A.class
│ ├── B.class
│ └── Main.class
└── src
├── A.java
├── B.java
└── Main.java
jar cfe app.jar Main -C out /
DemoApp
├── app.jar
├── out
│ ├── A.class
│ ├── B.class
│ └── Main.class
└── src
├── A.java
├── B.java
└── Main.java
java -jar app.jar
$ java -version
java version "17.0.3" 2022-04-19 LTS
Java(TM) SE Runtime Environment (build 17.0.3+8-LTS-111)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.3+8-LTS-111, mixed mode, sharing)
$ javac -version
javac 17.0.3
使用生成文件
JAVAC=javac
MAIN_CLASS=Main
APP_NAME=app
sources = $(wildcard src/*.java)
classes = $(sources:.java=.class)
all: program
program: $(classes)
clean:
@rm -rf out/
@rm *.jar
%.class: %.java
@$(JAVAC) -d out $<
jar: $(classes)
@jar -v --create --file $(APP_NAME).jar --main-class $(MAIN_CLASS) -C out/ .
exec: jar
java -cp .:out -jar $(APP_NAME).jar
.PHONY: all program clean jar
文件夹结构
├── Makefile
└── src
└── Main.java
$ make clean exec
added manifest
adding: Main.class(in = 413) (out= 288)(deflated 30%)
java -cp .:out -jar app.jar
Hello world
根据JAR 规范,清单文件的名称-值行必须以换行符( CR LF
、 CR
或LF
)结尾:
section: *header +newline nonempty-section: +header +newline newline: CR LF | LF | CR (not followed by LF) header: name: value
由于清单文件包含Main-Class: src.Main
但未被识别(“无主要清单属性...”),因此该行之后可能缺少换行符 - 最后一行。
一些编辑器不在文件末尾添加换行符。
为避免该问题,请始终在 Manifest 文件的末尾包含一个空行。
非常老的问题,我希望jar
工具能够纠正这个问题,或者至少会发出警告
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.