How to run a class from Jar which is not the Main-Class in its Manifest file

后端 未结 7 2189
情深已故
情深已故 2020-11-28 01:39

I have a JAR with 4 classes, each one has Main method. I want to be able to run each one of those as per the need. I am trying to run it from command-line on Linux box.

相关标签:
7条回答
  • 2020-11-28 02:18

    Apart from calling java -jar myjar.jar com.mycompany.Myclass, you can also make the main class in your Manifest a Dispatcher class.

    Example:

    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 讨论(0)
  • 2020-11-28 02:18

    Add below plugin in your pom.xml file and specify the Main Class with fully qualified name in element.

    <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>
    
    0 讨论(0)
  • 2020-11-28 02:23

    You can create your jar without Main-Class in its Manifest file. Then :

    java -cp MyJar.jar com.mycomp.myproj.dir2.MainClass2 /home/myhome/datasource.properties /home/myhome/input.txt
    
    0 讨论(0)
  • 2020-11-28 02:23

    Another similar option that I think Nick briefly alluded to in the comments is to create multiple wrapper jars. I haven't tried it, but I think they could be completely empty other than the manifest file, which should specify the main class to load as well as the inclusion of the MyJar.jar to the classpath.

    MyJar1.jar\META-INF\MANIFEST.MF

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

    MyJar2.jar\META-INF\MANIFEST.MF

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

    etc. Then just run it with java -jar MyJar2.jar

    0 讨论(0)
  • 2020-11-28 02:24

    You can execute any class which has a public final static main method from a JAR file, even if the jar file has a Main-Class defined.

    Execute Main-Class:

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

    Execute another class with a public static void main method:

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

    Note: the first uses -jar, the second uses -cp.

    0 讨论(0)
  • 2020-11-28 02:28

    First of all jar creates a jar, and does not run it. Try java -jar instead.

    Second, why do you pass the class twice, as FQCN (com.mycomp.myproj.dir2.MainClass2) and as file (com/mycomp/myproj/dir2/MainClass2.class)?

    Edit:

    It seems as if java -jar requires a main class to be specified. You could try java -cp your.jar com.mycomp.myproj.dir2.MainClass2 ... instead. -cp sets the jar on the classpath and enables java to look up the main class there.

    0 讨论(0)
提交回复
热议问题