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

35g0bw71  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(151)

我需要创建一个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文件?

wz8daaqr

wz8daaqr1#

项目结构

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

清单文件

Manifest-Version: 1.0
Main-Class: Main

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.将舱单、MF复制到外部

cp MANIFEST.MF out/

结果

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

3. Package 罐

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

项目结构-无清单。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

Package 罐

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
b91juud3

b91juud32#

根据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,但未被识别(“no main manifest attribute...”),因此该行(最后一行)之后可能缺少换行符。
有些编辑器不会在文件末尾添加换行符。
为了避免这个问题,请始终在清单文件的最后包含一个空行。
这是一个非常老的 * 问题 *,我希望jar工具能够纠正这个问题,或者至少能够对此发出警告

toiithl6

toiithl63#

$ 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

文件夹结构
一个二个一个一个

相关问题