Как запустить несколько основных программ в исполняемом файле Java .jar?

Я попробовал JAI, и это не сработало для меня.

Где вы застряли? Работает ли для вас следующее?

import java.io.File;
import java.io.FileOutputStream;
import java.awt.image.RenderedImage;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import javax.media.jai.NullOpImage;
import javax.media.jai.OpImage;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.TIFFDecodeParam;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageCodec;

public class Main {
    public static void main(String args[]) {
        File file = new File("input.tif");
        try {
            SeekableStream s = new FileSeekableStream(file);
            TIFFDecodeParam param = null;
            ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
            RenderedImage op = new NullOpImage(dec.decodeAsRenderedImage(0),
                                               null,
                                               OpImage.OP_IO_BOUND,
                                               null);
            FileOutputStream fos = new FileOutputStream("output.jpg");
            JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
            jpeg.encode(op.getData());
            fos.close();
        }
        catch (java.io.IOException ioe) {
            System.out.println(ioe);
        } 
    }
}
16
задан Brian 11 May 2011 в 00:15
поделиться

3 ответа

Jar-манифест позволяет вам указать не более одного основного класса. Это вызывается, когда вы выполняете java с флагом -jar.

java -jar myapp.jar

Вы можете включить несколько основных классов в один jar, но каждый (кроме необязательного 1 выше) должен вызываться с использованием флага -classpath и с указанием полного имени основного класса.

java -classpath myapp.jar com.mypackage.app.Main01 && \
  java -classpath myapp.jar com.mypackage.app.Main02 && \
  java -classpath myapp.jar com.mypackage.app.Main03

В приведенном выше примере будут созданы три отдельные виртуальные машины Java, каждая в своем собственном процессе. Очевидно, это не соответствует вашему требованию к «исполняемому банку».

В качестве альтернативы, вы можете захотеть иметь один основной метод, который запускает отдельные потоки, так что существует только один процесс, но одновременное выполнение.

Муравей не подходит для решения этой проблемы. Я подозреваю, что вам, вероятно, нужен единственный основной метод, который порождает несколько потоков. Не стесняйтесь предоставить больше информации о ваших требованиях.

25
ответ дан Synesso 11 May 2011 в 00:15
поделиться

Вы можете создать один основной «главный» класс, который выполняет остальные.

1
ответ дан fmucar 11 May 2011 в 00:15
поделиться

Возможно, я бы придерживался решения MANIFEST, но есть еще одна возможность сделать это:

Process p = Runtime.getRuntime().exec("java -jar another.jar");

Но здесь вы должны быть осторожны с путем и должны правильно завершить процесс, иначе ваша машина может достичь предела для файловых дескрипторов.

0
ответ дан David C 11 May 2011 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: