code

명령 줄에서 WAR의 클래스를 어떻게 실행합니까?

codestyles 2020. 11. 18. 09:07
반응형

명령 줄에서 WAR의 클래스를 어떻게 실행합니까?


메인이있는 Java 클래스가 있으며 명령 줄에서 독립 실행 형 앱으로 실행하는 데 사용했습니다.

java -jar myjar.jar params

아파치에서 실행되도록 코드를 다시 패키징해야했으며 이전 jar의 진입 점 클래스를 포함한 모든 코드는 웹 서버에 쉽게 배포 할 수 있도록 WAR 파일로 끝났습니다.

그러나 나는 여전히 명령 줄에서 실행할 수 있기를 원하고 코드는 변경되지 않았으며 모두 거기에 있으며 실행 방법을 알 수 없습니다.

내가 시도한 것은 ...

나는 전쟁이 단지 항아리와 같다고 생각 했으므로

java -jar mywar.war params

매니페스트에 정의 된 메인 클래스가 없다는 것은 실패했습니다.

수동으로 전쟁에 매니페스트를 추가하고 동일한 효과로 다시 시도했습니다.

전쟁에서 manifest.mf를 포함하는 META-INF라는 폴더가 있다는 것을 알았으므로 일반 매니페스트에 하듯이 메인 클래스를 선언하는 행을 추가했습니다.

Manifest-Version: 1.0
Main-Class: mypackage.MyEntryPointClass

이것은 noClassDefFoundError mypackage.MyEntryPointClass일종의 진행입니다. 그것은 단지 경로 문제라고 믿게 만들었습니다.

Manifest-Version: 1.0
Main-Class: WEB-INF.classes.mypackage.MyEntryPointClass

이제 동일한 오류가 발생하지만 스택 추적으로 ...

Exception in thread "main" java.lang.NoClassDefFoundError: WEB-INF/classes/mypackage/MyEntryPointClass (wrong name: mypackage/MyEntryPointClass)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

나는 조금 봤지만 내 질문에 대한 답을 찾을 수 없었고 여기에서 약간 다른 몇 가지 다른 질문을 읽었으므로 게시 할 것이라고 생각했습니다.

Java 1.5는 어떤 차이를 만들어야한다고 생각하지 않습니다.


Hudson (연속 통합 프로젝트)이하는 일을 할 수 있습니다 . Tomcat에 배포하거나 다음을 사용하여 실행할 수있는 전쟁을 다운로드합니다.

java -jar hudson.war

(내장 된 Jetty 엔진이 있기 때문에 명령 줄에서 실행하면 서버가 시작됩니다.) 어쨌든 hudson의 매니페스트를 보면 아카이브의 루트에 Main 클래스를 넣는 것을 이해합니다. 귀하의 경우 전쟁 레이아웃은 다음과 같아야합니다.

루트 아래 :

  • mypackage / MyEntryPointClass.class
  • WEB-INF / lib
  • WEB-INF / 클래스
  • META-INF / MANIFEST.MF

매니페스트에는 다음 줄이 포함되어야합니다.

Main-Class: mypackage.MyEntryPointClass

mypackage / MyEntryPointClass.class는 명령 줄에서만 액세스 할 수 있으며 WEB-INF / classes 아래의 클래스는 응용 프로그램 서버에서만 액세스 할 수 있습니다.

HTH


Richard Detsch와 비슷하지만 따라하기가 조금 더 쉽습니다 (패키지에서도 작동합니다)

1 단계 : War 파일을 풉니 다.

jar -xvf MyWar.war

2 단계 : 디렉토리로 이동

cd WEB-INF

3 단계 : 모든 의존성으로 메인 실행

java -classpath "lib/*:classes/." my.packages.destination.FileToRun

전쟁은 웹앱입니다. 웹앱과 동일한 클래스를 재사용하는 콘솔 / 독립형 애플리케이션을 원하면 공유 클래스를 jar에 패키징하여 WEB-INF/lib. 그런 다음 명령 줄에서 해당 jar를 사용합니다. 따라서 두 콘솔 애플리케이션을 모두 얻을 수 있으며 두 개의 다른 패키지를 만들지 않고도 서블릿에서 동일한 클래스를 사용할 수 있습니다. 물론 이것은 전쟁이 폭발했을 때 사실입니다.


배포 된 war 파일에서 SomeClass.main (String [] args)을 실행하려면 다음을 수행하십시오.

1 단계 : 기본 메서드 메서드가있는 SomeClass.java 클래스 작성, 즉 (public static void main (String [] args) {...})

2 단계 : WAR 배포

3 단계 : cd / usr / local / yourprojectsname / tomcat / webapps / projectName / WEB-INF

Step 4: java -cp "lib/jar1.jar:lib/jar2.jar: ... :lib/jarn.jar" com.mypackage.SomeClass arg1 arg2 ... arg3

Note1: (to see if the class SomeOtherClass.class is in /usr/tomcat/webapps/projectName/WEB-INF/lib)

run --> cd /usr/tomcat/webapps/projectName/WEB-INF/lib && find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep SomeOtherClass.class; then echo "$jarfile"; fi; done

Note2: Write to standard out so you can see if your main actually works via print statements to the console. This is called a back door.

Note3: The comment above by Bozhidar Bozhanov seems correct


The rules of locating classes in an archive file is that the location of the file's package declaration and the location of the file within the archive have to match. Since your class is located in WEB-INF/classes, it thinks the class is not valid to run in the current context.

The only way you can do what you're asking is to repackage the war so the .class file resides in the mypackage directory in the root of the archive rather than the WEB-INF/classes directory. However, if you do that you won't be able to access the file from any of your web classes anymore.

If you want to reuse this class in both the war and outside from the java command line, consider building an executable jar you can run from the command line, then putting that jar in the war file's WEB-INF/lib directory.


In Maven project, You can build jar automatically using Maven War plugin by setting archiveClasses to true. Example below.

<plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-war-plugin</artifactId>
       <configuration>
        <archiveClasses>true</archiveClasses>
       </configuration>
</plugin>

If you're using Maven, just follow the maven-war-plugin documentation about "How do I create a JAR containing the classes in my webapp?": add <attachClasses>true</attachClasses> to the <configuration> of the plugin:

<project>
  ...
  <artifactId>mywebapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  ...
  <build>
    <plugins>
      <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
      <attachClasses>true</attachClasses>
    </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

The you will have 2 products in the target/ folder:

  • The project.war itself
  • The project-classes.jar which contains all the compiled classes in a jar

Then you will be able to execute a main class using classic method: java -cp target/project-classes.jar 'com.mycompany.MainClass' param1 param2


Well, according to Wikipedia, with a WAR file, the classes that get loaded into the classpath are in the "/WEB-INF/classes" and "/WEB-INF/lib" directory.

You could try simply putting a copy of the classes on the root file system of the zip file (which is what a war/jar is). I'm not sure if that would work though.

You can always just create two separate files.


It's not possible to run a java class from a WAR file. WAR files have a different structure to Jar files.

To find the related java classes, export (preferred way to use ant) them as Jar put it in your web app lib.

Then you can use the jar file as normal to run java program. The same jar was also referred in web app (if you put this jar in web app lib)

참고URL : https://stackoverflow.com/questions/1842972/how-do-i-run-a-class-in-a-war-from-the-command-line

반응형