jar- 파일을 실행할 수 없습니다 :“no main manifest attribute”
응용 프로그램을 설치했는데 실행하려고 할 때 (실행 가능한 jar) 아무 일도 일어나지 않습니다. 명령 줄에서 다음과 같이 실행할 때 :
java -jar "app.jar"
다음과 같은 메시지가 나타납니다.
"app.jar"에 주요 매니페스트 속성이 없습니다.
일반적으로 프로그램을 직접 만든 경우 매니페스트 파일에 기본 클래스 특성을 추가했을 것입니다. 하지만이 경우 파일이 응용 프로그램에서 가져온 것이므로 그렇게 할 수 없습니다. 또한 메인 클래스를 찾을 수 있는지 확인하기 위해 항아리를 추출하려고 시도했지만 많은 클래스가 있으며 이름에 "main"이라는 단어가 포함되어 있지 않습니다. 프로그램이 다른 시스템에서 잘 실행되기 때문에이 문제를 해결할 방법이 있어야합니다.
첫째, 어떤 이상한의, 당신이 실행 볼 수 java -jar "app"
하지java -jar app.jar
둘째, jar를 실행 가능하게 만들려면 META-INF / MANIFEST.MF라는 파일을 jar로 만들어야합니다.
파일 자체에는 최소한 다음 하나의 라이너가 있어야합니다.
Main-Class: com.mypackage.MyClass
public static void main (String [] args) 진입 점을 com.mypackage.MyClass
보유하는 클래스는 어디에 있습니까 ?
CLI, Maven, Ant 또는 Gradle을 사용하여이 작업을 수행하는 방법에는 여러 가지가 있습니다.
내용은 CLI , 다음 명령이 어떤 작업을 수행 : (TKS @ dvvrt ) jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
들어 메이븐 , 다음 코드 같은 트릭을 할해야합니다. 이것은 전체 pom.xml이 아닌 플러그인 정의 일뿐입니다 .
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.mypackage.MyClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
( <version>
프로젝트에 적합한 것을 선택 하십시오.)
를 들어 개미 의 도움이 있어야 아래 니펫을 :
<jar destfile="build/main/checksites.jar">
<fileset dir="build/main/classes"/>
<zipfileset includes="**/*.class" src="lib/main/some.jar"/>
<manifest>
<attribute name="Main-Class" value="com.acme.checksites.Main"/>
</manifest>
</jar>
크레딧 Michael Niemand-
대한 Gradle을 :
plugins {
id 'java'
}
jar {
manifest {
attributes(
'Main-Class': 'com.mypackage.MyClass'
)
}
}
즉 했어야 java -jar app.jar
대신 java -jar "app"
.
이 -jar
옵션은 JAR 파일이 실행 가능한 JAR 파일 인 경우에만 작동합니다. 즉, Main-Class
속성 이있는 매니페스트 파일이 있어야 합니다. 실행 가능한 JAR을 만드는 방법 은 JAR 파일의 프로그램 패키징을 참조하십시오 .
실행 가능한 JAR이 아닌 경우 다음과 같이 프로그램을 실행해야합니다.
java -cp app.jar com.somepackage.SomeClass
프로그램을 실행할 메서드 com.somepackage.SomeClass
가 포함 된 클래스는 어디에 있습니까 main
? (그 클래스는 프로그램에 따라 다르며 제공 한 정보로는 알 수 없습니다.)
또는 아래 예제와 같이 maven-assembly-plugin을 사용할 수 있습니다.
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.package.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
이 예에서는 섹션에 지정된 모든 종속성 jar가 단일 jar에 자동으로 포함됩니다. jar-with-dependencies는 포함하려는 jar 파일 이름으로 대체되지 않도록 문자 그대로 넣어야합니다.
이는 Java가 MANIFEST.MF 파일에서 Main 속성을 찾을 수 없기 때문입니다. Main 속성은 애플리케이션의 진입 점으로 사용해야하는 클래스를 Java에 알려주는 데 필요합니다. jar 파일 내에서 MANIFEST.MF 파일은 META-INF 폴더에 있습니다. jar 파일 내부를 어떻게 볼 수 있는지 궁금하십니까? WinRAR로 jar 파일을 엽니 다.
MANIFEST.MF 내부의 주요 속성은 다음과 같습니다.
Main-Class: <packagename>.<classname>
MANIFEST.MF 파일에서이 줄이 누락 된 경우 "no main manifest attribute"오류가 발생합니다.
MANIFEST.MF 파일 내에이 속성을 지정하는 것은 정말 엉망입니다.
업데이트 : 이클립스에서 응용 프로그램의 진입 점을 지정하는 정말 깔끔한 방법을 찾았습니다. 내보내기라고하면
Select Jar and next
[ give it a name in the next window ] and next
and next again
and you'll see " Select the class of the application entry point".
Just pick a class and Eclipse will automatically build a cool MANIFEST.MF for you.
Gradle 대답은 다음과 같이 jar / manifest / attributes 설정을 추가하는 것입니다.
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'com.package.app.Class'
}
}
maven의 경우 다음과 같이 해결되었습니다 (저는 GitHub의 Veetle 코드베이스).
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>org.lazydevs.veetle.api.VeetleAPI</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
건배...
IntelliJ IDEA를 사용하여 항아리를 만들 때이 문제가 발생했습니다. 이 토론을 참조하십시오 .
나를 위해 해결 한 것은 JAR> 종속성이있는 모듈에서를 선택하고 META-INF / MANIFEST.MF의 기본 디렉토리를 수락하지 않고 jar 아티팩트를 다시 만드는 것이 었습니다. -/ src / main / java에서-/ src / main / resources로 변경하십시오.
그렇지 않으면 jar에 매니페스트 파일이 포함되었지만-/ src / main / java에 있어야하는 파일은 포함되지 않았습니다.
jar를 포함하려면 다음 명령을 시도하십시오.
java -cp yourJarName.jar your.package..your.MainClass
나는 같은 문제가 있었다. pom 파일에 다음 줄을 추가하면 작동합니다. 플러그인은 필요한 모든 단계를 통해 애플리케이션의 빌드 프로세스를 확인합니다.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
나를 위해 어떤 답변도 실제로 도움이되지 않았습니다. Main-Class와 모든 것을 포함하는 매니페스트 파일을 올바른 위치에 두었습니다. 나를 넘어 뜨린 것은 이것이었습니다.
경고 : 매니페스트를 만드는 텍스트 파일은 새 줄 또는 캐리지 리턴으로 끝나야합니다. 마지막 줄은 새 줄이나 캐리지 리턴으로 끝나지 않으면 제대로 구문 분석되지 않습니다.
( 소스 ). 매니페스트 끝에 개행을 추가하면 문제가 해결되었습니다.
Maven을 사용하는 경우 pom에 다음을 포함하십시오.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
방금 같은 오류가 발생했습니다. 사용하는 경우 gradle
다음을 추가하십시오 gradle.build
.
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'com.company.project.MainClass'
}
}
어디 com.company.project.MainClass
와 UR 클래스 경로 public static void main(String[] args)
방법.
오늘도 같은 문제가 발생했습니다. 내 문제는 META-INF를 리소스 폴더로 이동하는 것이 해결되었습니다.
jar가 규칙을 따르지 않으면 실행 가능한 jar가 아닙니다.
나는 같은 문제에 직면했고 이제 수정되었습니다.) 아래 단계를 따르고 오류가 발생할 수 있지만 아래 단계를 수행하면 프로세스가 더 원활 해집니다. 나는 해결책을 찾기 위해 많은 시간을 보냅니다.
1. Eclipse를 다시 시작하십시오 (Eclipse를 사용하여 JAR 파일을 빌드하는 경우)-> 실제로 이것은 JAR 파일을 올바르게 내보내는 데 도움이되었습니다.
2. Eclipse를 다시 시작한 후 Eclipse가 Java 프로젝트에서 기본 클래스 / 메서드를 인식 할 수 있는지 확인-> 마우스 오른쪽 단추 클릭-> 다음으로 실행-> 구성 실행-> 기본-> 검색 버튼 클릭 Eclipse가 JAR 파일에서 기본 클래스를 찾을 수 있는지 확인하십시오. -> 이것은 JAR 파일이 메인 클래스에 대한 진입 점을 가질 것이라는 확인을위한 것입니다.
그런 다음 Java Dynamic 프로젝트를 JAR 파일이 아닌 "Runnable JAR"파일로 내 보냅니다.
Java 시작 구성에서 기본 클래스를 선택합니다.
jar 파일을 내 보내면 아래 명령을 사용하여 실행하십시오. java -cp [사용자 JAR] .jar [전체 패키지] .MainClass 예 : java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
지원되지 않는 Java 버전 오류가 발생할 수 있습니다. 수정 사항은 Eclipse에서 프로젝트를 컴파일하는 데 사용되는 Java 버전과 일치하도록 쉘 bash 프로필의 java_home을 변경하는 것입니다.
도움이 되었기를 바랍니다! 여전히 문제가 있으면 알려주세요.
실행 가능한 jar 파일은 클릭하거나 java -jar app.jar과 같은 명령 프롬프트를 사용하여 실행해야합니다 ( "jar의 경로에 공백이있는 경우"사용-즉 java -jar "C : \ folder name \ app.jar"). 실행 가능한 jar가 실행되고 있지 않으면 제대로 생성되지 않은 것입니다.
더 나은 이해를 위해 jar 파일을 추출하고 (또는 모든 도구를 사용하여보기, Windows 7-Zip이 좋은 경우) /META-INF/MANIFEST.MF에서 파일을 확인하십시오. 다음과 같은 항목을 찾으면
Main-Class : your.package.name.ClaaswithMain-그러면 괜찮습니다. 그렇지 않으면 제공해야합니다.
MANIFEST.MF 파일에 Main-Class 항목을 추가하는 것에주의하고 저장 위치를 확인하십시오!
이 단계를 따르기 만하면됩니다.
jar -cfm jarfile-name manifest-filename Class-file name
jar 파일을 실행하는 동안 다음과 같이 간단하게 실행하십시오.
java -cp jarfile-name main-classname
jar 파일을 제대로 만들지 않았을 수 있습니다.
예 : jar 생성시 옵션 m 누락
다음 작업 :
jar -cvfm MyJar.jar Manifest.txt *.class
나는 같은 문제가 있었다. 여기에 언급 된 많은 솔루션이 전체 그림을 제공하지 않았으므로 명령 줄에서 jar 파일을 압축 하는 방법에 대한 요약을 제공하려고합니다 .
당신은 당신이 원하는 경우
.class
패키지 파일의 시작 부분에 패키지를 추가합니다.java
.Test.java
package testpackage; public class Test { ... }
.class
패키지 이름에 지정된 구조로 끝나는 파일로 코드를 컴파일하려면 다음을 사용하십시오.javac -d . Test.java
는
-d .
컴파일러가 원하는 디렉토리 구조를 만들 수 있습니다..jar
파일을 패키징 할 때 파일을 패키징하는 방법에 대해 jar 루틴에 지시해야합니다. 여기에서는 옵션 세트를 사용합니다cvfeP
. 이는 패키지 구조 (옵션P
) 를 유지하고 매니페스트 파일에 의미있는 정보 (옵션 ) 가 포함되도록 진입 점을 지정하는 것e
입니다. 옵션을f
사용하면 파일 이름을 지정할 수 있고 옵션c
은 아카이브를 생성하며 옵션v
은 출력을 상세 정보로 설정합니다. 여기서 주목해야 할 중요한 사항은P
및e
입니다.그러면 우리가 원하는 항아리의 이름이 나온다
test.jar
.그런 다음 진입 점이옵니다.
그런 다음
-C . <packagename>/
폴더 구조를 유지하면서 해당 폴더에서 클래스 파일을 가져 옵니다 .jar cvfeP test.jar testpackage.Test -C . testpackage/
.jar
zip 프로그램에서 파일을 확인하십시오 . 다음과 같은 구조를 가져야합니다.test.jar
META-INF | MANIFEST.MF testpackage | Test.class
MANIFEST.MF에는 다음이 포함되어야합니다.
Manifest-Version: 1.0 Created-By: <JDK Version> (Oracle Corporation) Main-Class: testpackage.Test
매니페스트를 수동 으로 편집하는 경우 끝에 개행을 유지해야 합니다. 그렇지 않으면 Java가 인식하지 못합니다.
다음으로
.jar
파일 실행java -jar test.jar
저는 개인적으로 여기에있는 모든 답변이 질문을 오해하고 있다고 생각합니다. 이에 대한 대답은 spring-boot가 .jar을 빌드하는 방법의 차이에 있습니다. Spring Boot가 다음과 같은 매니페스트를 설정한다는 것을 누구나 알고 있습니다. 이것은 표준 .jar 실행이라고 가정 하는 모든 사람의 가정과 다릅니다 .
Start-Class: com.myco.eventlogging.MyService
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 1.4.0.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_131
Main-Class: org.springframework.boot.loader.JarLauncher
아마도 org.springframework.boot.loader.JarLauncher
클래스 경로 에서 실행해야 할까요?
나 에게이 오류는 단순한 라이브러리 jar 파일이 아닌 실행 가능한 jar 파일을 원한다고 Eclipse에 알리는 것을 잊었 기 때문에 발생했습니다. 따라서 Eclipse에서 jar 파일을 만들 때 오른쪽 라디오 버튼을 클릭하십시오.
위의 답변은 나에게 부분적으로 도움이되었습니다. java -cp
대답의 일부 였지만 실행할 클래스를 식별하는 방법에 대한보다 구체적인 정보가 필요했습니다. 나를 위해 일한 것은 다음과 같습니다.
1 단계 : 실행해야하는 클래스 찾기
jar tf /path/to/myjar.jar | more
결과의 맨 위 줄은 다음과 같습니다.
META-INF/
META-INF/MANIFEST.MF
somepath/
somepath/App.class
META-INF/maven/
...
App.class에는 실행할 기본 클래스가 포함되어 있습니다. 필요한 클래스가 항상 첫 번째 클래스라고 가정 할 수 있는지 100 % 확신 할 수는 없지만 저를위한 것이 었습니다. 그렇지 않다면 grep을 사용하여 라이브러리 관련 결과를 제외하여 클래스 목록을 관리 가능한 크기로 축소하는 것이 그리 어렵지 않다고 생각합니다.
거기에서 그것은 쉬웠다. 나는 단지 그 경로 ( ".class"접미사 빼기)를 사용한다.
java -cp /path/to/myjar.jar somepath/App
MANIFEST.MF를 추가했기 때문에이 파일에서 Field의 순서를 고려해야한다고 생각합니다. 내 환경은java version "1.8.0_91"
그리고 여기에 내 MANIFEST.MF
// MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_91 (Oracle Corporation)
Main-Class: HelloWorldSwing
// run
~ java -jar HelloWorldSwing.jar
no main manifest attribute, in HelloWorldSwing.jar
그러나 이것은 아래와 같이 실행됩니다.
Manifest-Version: 1.0
Main-Class: HelloWorldSwing
Created-By: 1.8.0_91 (Oracle Corporation)
//this run swing normally
(첫 번째 게시물-깨끗하지 않을 수 있습니다)
이것은 OS X 11.6, Maven 기반 Netbeans 8.2 프로그램에 대한 수정 사항입니다. 지금까지 내 앱은 100 % Netbeans입니다. 조정이 필요하지 않습니다 (불가능을 위해 몇 개의 쉘 이스케이프!).
여기와 다른 곳에서 대부분의 답변을 시도한 후 "작동하는 것을 사용"하는 기술로 돌아 왔습니다.
여기에있는 최고 답변 ( olivier-refalo thanx)은 시작하기에 적합한 장소처럼 보였지만 도움이되지 않았습니다.
작동했던 다른 프로젝트를 살펴보면 매니페스트 라인에서 약간의 차이가 있음을 알았습니다.
- addClasspath, classpathPrefix가 없음 (삭제됨)
- mainClass was missing the "com." (used the NB -> Project Properties->Run->Main Class->Browse to specify)
Not sure why (I am only 3 months into java) or how, but can only say this worked.
Here is just the modified manifest block used:
<manifest>
<mainClass>mypackage.MyClass</mainClass>
</manifest>
I found a new solution to bad manifest generation !
- Open the jar file with a zip editor like WinRAR
Click on for META-INF
Add or edit
Add:
Create a text file called MANIFEST.MF in a folder called META-INF and add the following line:
- Manifest-Version: 1.0
- Main-Class: package.ex.com.views.mainClassName
Save the file and add it to the zip
Edit:
- Drag the file out modify the MANIFEST.MF to add the previous line
Open cmd and type: java -jar c:/path/JarName.jar
It should work fine now !
You might have the same problem as I do. After creating your .jar file, write jar xf app.jar META-INF/MANIFEST.MF
. This will create a copy of the file to your current directory so you can read it. If it only says something like:
Manifest-Version: 1.0
Created-By: 1.8.0_51 (Oracle Corporation)
and does not contain the "Main-Class" declaration, then I think you found your problem.
I do not know how to solve it, though. I checked other people with same/similar problems on StackOverflow and couldn't find an answer. However with this information you can perhaps get some better help (given the fact that you have the same problem as I).
Edit: I had tried with a manifest-file but didn't get it to work, but my mistake was to only name one of the classes when creating the jar-file. I wrote *.class instead and it works now.
Although I don't know why there is a need to create a manifest-file. But I guess it's fine as long as it works.
If you are using the command line to assemble .jar it is possible to point to the main without adding Manifest file. Example:
jar cfve app.jar TheNameOfClassWithMainMethod *.class
(param "e" does that: TheNameOfClassWithMainMethod is a name of the class with the method main() and app.jar - name of executable .jar and *.class - just all classes files to assemble)
I had this problem and i solved it recently by doing this in Netbeans 8 (Refer to the image below):
- go to properties of your project.
- click on Run.
- specify the main class of your project using browse.
- build and run the Jar file.
Just to make one point clear about
Main-Class: <packagename>.<classname>
패키지가없는 경우 다음과 같이 해당 부분을 무시해야합니다.
Main-Class: <classname>
대부분의 솔루션이 나를 위해 작동하지 않았지만 강사가 나를 도와주었습니다. 여기서 그의 솔루션을 공유하고 싶습니다 .kali linux 터미널을 사용했지만 모든 데비안에서 괜찮을 것입니다.
javac *.java
nano MANIFEST.MF
파일 형식
주 클래스 : 주 또는 주 파일 이름이 무엇이든 (존재하는 경우 패키지 이름을 추가해야 함)
jar -cvmf MANIFEST.MF new.jar *.class
이제 파일 사용을 실행하십시오.
java -jar new.jar
또는 파일 속성으로 이동하여
프로그램으로 파일 실행 허용
더블 클릭
위 답변의 대부분은 도움이되지 않았지만
참고 URL : https://stackoverflow.com/questions/9689793/cant-execute-jar-file-no-main-manifest-attribute
'Program Tip' 카테고리의 다른 글
bash 쉘 스크립트에서 모든 인수 전파 (0) | 2020.09.29 |
---|---|
특정 파일 / 폴더를 제외한 tar 디렉토리에 대한 쉘 명령 (0) | 2020.09.29 |
AssemblyVersion, AssemblyFileVersion 및 AssemblyInformationalVersion의 차이점은 무엇입니까? (0) | 2020.09.28 |
Python에서 파일 생성 및 수정 날짜 / 시간을 얻는 방법은 무엇입니까? (0) | 2020.09.28 |
'ref'와 'out'키워드의 차이점은 무엇입니까? (0) | 2020.09.28 |