2011-03-29 17 views
80

Her birinde Ana yöntem olan 4 sınıflı bir JAR var. İhtiyaca göre bunların her birini çalıştırabilmek istiyorum. Linux kutusundaki komut satırından çalıştırmaya çalışıyorum. Benim Manifest dosyasında başlıca olarak bir sınıf belirtebilirsiniz biliyoruzManifest dosyasında Ana Sınıf olmayan Jar'dan bir sınıf nasıl çalıştırılır

com/mycomp/myproj/dir1/MainClass1.class 
com/mycomp/myproj/dir2/MainClass2.class 
com/mycomp/myproj/dir3/MainClass3.class 
com/mycomp/myproj/dir4/MainClass4.class 

:

E.g. The name of my JAR is MyJar.jar 

O şöyle ana sınıflar için dizin yapısı vardır. Ancak, çalıştırmak istediğim sınıfı çalıştırmak için komut satırında bazı argümanları belirleyebileceğim herhangi bir yol var mı?

bu çalıştı:

jar cfe MyJar.jar com.mycomp.myproj.dir2.MainClass2 com/mycomp/myproj/dir2/MainClass2.class /home/myhome/datasource.properties /home/myhome/input.txt 

Ve bu hata var:

com/mycomp/myproj/dir2/MainClass2.class : no such file or directory 

(yukarıdaki komutta, '/home/myhome/datasource.properties' ve '/ home/myhome /input.txt 'komut satırı bağımsız değişkenleridir.

+0

Sadece farklı kavanozlarda, bağımlılıkları tutmak için başka bir kavanoz kullanarak paketleyin? – Nick

+6

Neden komut satırı bağımsız değişkenlerini temel alan belirli bir yöntemi (4'ten) çağıran tek ana sınıfınız yok? –

cevap

111

Manifest dosyasında Ana Sınıfı olmayan jar'ınızı oluşturabilirsiniz. Ardından:

java -cp MyJar.jar com.mycomp.myproj.dir2.MainClass2 /home/myhome/datasource.properties /home/myhome/input.txt 
+2

Doktora göre bu işe yaramaz: "Bu seçeneğin çalışması için, JAR dosyasının bildirimi Ana Sınıf: sınıf adı biçiminde bir satır içermelidir." – Thomas

+0

"Ana Sınıf manifest niteliği yüklenemedi Başlangıç ​​MyJar.jar " – Bhushan

+2

Thomas haklı. "-cp" ile "-jar" değiştirmeniz gerekir. Güncel koduma bakın – lxu4net

2

Her şeyden önce jar bir kavanoz oluşturur ve çalıştırmaz. Bunun yerine java -jar'u deneyin.

İkinci olarak, neden FQCN (com.mycomp.myproj.dir2.MainClass2) ve dosya olarak (com/mycomp/myproj/dir2/MainClass2.class) sınıfını iki kez geçiriyorsunuz?

Düzenleme: java -jar belirtilecek bir ana sınıf gerektiriyorsa olarak

görünüyor. Bunun yerine java -cp your.jar com.mycomp.myproj.dir2.MainClass2 ... deneyebilirsiniz. -cp, sınıf yolundaki kavanozu ayarlar ve java'nın oradaki ana sınıfa bakmasını sağlar.

+0

Burada belirtildiği gibi yaptım: http://download.oracle.com/javase/tutorial/deployment/jar/appman.html – Bhushan

+0

Bu sayfadan: "Bir jar dosyası oluştururken veya güncellerken kullanılabilir." - Yani bu, ana sınıfı özniteliğini ayarlamak için değil, jar'ı çalıştırmak için kullanılır. – Thomas

8

dışında java -jar myjar.jar com.mycompany.Myclass aramasını, ayrıca Manifest bir Dispatcher sınıfta ana sınıf yapabilirsiniz.

Örnek:

public class Dispatcher{ 

    private static final Map<String, Class<?>> ENTRY_POINTS = 
     new HashMap<String, Class<?>>(); 
    static{ 
     ENTRY_POINTS.put("foo", Foo.class); 
     ENTRY_POINTS.put("bar", Bar.class); 
     ENTRY_POINTS.put("baz", Baz.class); 
    } 

    public static void main(final String[] args) throws Exception{ 

     if(args.length < 1){ 
      // throw exception, not enough args 
     } 
     final Class<?> entryPoint = ENTRY_POINTS.get(args[0]); 
     if(entryPoint==null){ 
      // throw exception, entry point doesn't exist 
     } 
     final String[] argsCopy = 
      args.length > 1 
       ? Arrays.copyOfRange(args, 1, args.length) 
       : new String[0]; 
     entryPoint.getMethod("main", String[].class).invoke(null, 
      (Object) argsCopy); 

    } 
} 
0

Nick kısaca yorumlarında ima düşünüyorum başka benzer bir seçenek birden sarıcı kavanoz yaratmaktır. Denemedim, ama sanırım, tüm ana dosya sınıfını belirtmek zorunda olan, manifest dosyasının dışında tamamen boş olabilirler. Ayrıca, MyJar.jar dosyasının sınıf yoluna eklenmesi de gerekir.

MyJar Jar \ META-INF \ MANIFEST.MF

Manifest-Version: 1.0 
Main-Class: com.mycomp.myproj.dir1.MainClass1 
Class-Path: MyJar.jar 

MyJar Jar \ META-INF \ MANIFEST.MF

Manifest-Version: 1.0 
Main-Class: com.mycomp.myproj.dir2.MainClass2 
Class-Path: MyJar.jar 

vs. Sonra sadece sen bir JAR dosyasından bir public final static main yöntemi olan herhangi sınıf yürütebileceği java -jar MyJar2.jar

67

ile çalıştırın, kavanoz dosyası Main-Class tanımlanmış olsa bile.

ana sınıfını yürütün:

java -jar MyJar.jar // will execute the Main-Class 

bir public static void main yöntemi ile başka bir sınıf yürütün:

java -cp MyJar.jar com.mycomp.myproj.AnotherClassWithMainMethod 

Not: İlk -jar kullanan ikinci -cp kullanır.

+4

Ayrıca, tüm dizileri de classpath üzerindeki geçerli dizinde (örneğin, lib dizini Main sınıfını çalıştırarak) istiyorsanız, 'java -cp 'yi kullanabilirsiniz ./*" com.mycomp.myproj.AnotherClassWithMainMethod' " ./* 'unix makinelerini genişletmesini önleme. Ayrıca "./*. Jar" 'ın çalışmayacağını unutmayın. –

1

Aşağıdaki eklentiyi pom.xml dosyanıza ekleyin ve elementte tam nitelikli adı olan Ana Sınıfı belirtin.

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>1.2.5.RELEASE</version> 
    <configuration> 
     <mainClass>**main Class name with full qualified name**</mainClass> 
    </configuration> 
    <executions> 
     <execution> 
      <goals> 
       <goal>repackage</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
İlgili konular