繁体   English   中英

来自 Main.class 创建的 jar:没有主要的清单属性,在 jar 中

[英]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

主.java

无包裹

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()));
    }
}

脚步

1.编译:

javac src/*.java -d out

结果

DemoApp
└── out
    ├── A.class
    ├── B.class
    └── Main.class

2.复制MANIFEST.MF到out

cp MANIFEST.MF out/

结果

DemoApp
└── out
    ├── A.class
    ├── B.class
    ├── Main.class
    └── MANIFEST.MF

3. 包装罐

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

4.发射:

java -jar app.jar

Jar文件结构

app.jar
├── A.class
├── B.class
├── Main.class
└── META-INF
    └── MANIFEST.MF

项目结构 - 无 MANIFEST.MF

DemoApp
└── src
    ├── A.java
    ├── B.java
    └── Main.java

脚步

编译.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 LFCRLF )结尾:

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM