Java-приложение правильно работает в Eclipse, но не как .jar - PullRequest
1 голос
/ 01 сентября 2010

Я создаю Java-приложение, которое создает 4 PDF-файла, используя iText.На том, который создает PDF-файл с изображением, файл .jar создает 0-байтовый файл и не продолжает выполнение.Тем не менее, когда я щелкаю правой кнопкой мыши >> Запуск от имени >> Java-приложения, он работает просто отлично.Чтобы создать jar, я делаю следующее

  • Щелкните правой кнопкой мыши src
  • Export
  • Запускаемый файл JAR
  • Извлеките необходимые библиотеки в сгенерированныйJAR
  • Готово

И файл "penguin.jpg" находится в каталоге src.

Вот мой код

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;

public class ITextHelloWorld 
{
    public ITextHelloWorld() throws Exception
    {
        // Create the new document objects
        Document helloWorld = new Document();
        Document bigHello = new Document();
        Document linux = new Document();
        Document tables = new Document();


    /**********************************************************
                        start Big Hello.pdf
    This document is a huge document of text. Approximately 
    28 million characters, 24,391 pages, and 9.5 MB.
     **********************************************************/
    PdfWriter.getInstance(bigHello, new FileOutputStream("Big Hello.pdf"));
    bigHello.open();

    for (int i=0; i <1000000; i++)
    {
        bigHello.add(new Paragraph("Hello World. It's me again."));
    }

    bigHello.close();
    /**********************************************************
                        end Big Hello.pdf
     **********************************************************/

    /**********************************************************
                        start Tables.pdf
    This document will have tables in it
     **********************************************************/

    PdfWriter.getInstance(tables, new FileOutputStream("Tables.pdf"));
    tables.open();

    PdfPTable table=new PdfPTable(4);
    for (int i = 1; i<100; i++)
    {       
        table.addCell("This is cell #" + i + ".\n");
    }

    tables.add(table);
    tables.close();
    /**********************************************************
                        end Tables.pdf
     **********************************************************/

    /**********************************************************
                        start Linux.pdf
    This is a document that has text, graphics, and links.
     **********************************************************/
    PdfWriter.getInstance(linux, new FileOutputStream("Graphics and Text.pdf"));
    linux.open();       
    Image image = Image.getInstance("penguin.jpg");
    linux.add(image);

    linux.add(new Paragraph("Let's talk about Linux. \n\n" +
            "Linux (commonly pronounced /ˈlɪnəks/ LIN-əks in American English, also pronounced " +
            "/ˈlɪnʊks/ LIN-ooks in Europe and Canada) refers to the family of Unix-like computer " +
            "operating systems using the Linux kernel. Linux can be installed on a wide variety of " +
            "computer hardware, ranging from mobile phones, tablet computers and video game consoles, " +
            "to mainframes and supercomputers. Linux is predominantly known for its use " +
            "in servers; in 2009 it held a server market share ranging between 20–40%. Most desktop " +
            "computers run either Microsoft Windows or Mac OS X, with Linux having anywhere from a " +
            "low of an estimated 1–2% of the desktop market to a high of an estimated 4.8%. " +
            "However, desktop use of Linux has become increasingly popular in recent years, partly " +
            "owing to the popular Ubuntu, Fedora, Mint, and openSUSE distributions and the emergence" +
            " of netbooks and smartphones running an embedded Linux."));

    linux.close();
    /**********************************************************
                        end Linux.pdf
     **********************************************************/

    /**********************************************************
                        start Hello World.pdf
    This document is one line of text.
     **********************************************************/
    PdfWriter.getInstance(helloWorld, new FileOutputStream("Hello World.pdf"));
    helloWorld.open();
    helloWorld.add(new Paragraph("Hello World. It's me again."));
    helloWorld.close();
    /**********************************************************
                        end Hello World.pdf
     **********************************************************/

}

public static void main (String args[])
{
    try
    {
        new ITextHelloWorld();
    }

    catch (Exception e)
    {
        System.out.println(e);
    }
}

}

Спасибо за любую помощь!
Томас

Ответы [ 3 ]

4 голосов
/ 01 сентября 2010

Томас, проблема в том, что когда вы создаете банку, вы «путаете» структуру каталогов.Вам необходимо извлечь изображение из банки следующим способом:

InputStream stream = this.getClass().getClassLoader()
                              .getResourceAsStream("/images/image.jpg");

Вам необходимо отредактировать путь к изображению, если необходимо.

Ваш код Image будет выглядеть примерно так:

Image image = Image.getInstance(this.getClass().getResource("/penguin.jpg"));

Связанный вопрос:

Java Swing Отображение изображений изнутри банки

2 голосов
/ 01 сентября 2010

По-видимому, проблема заключается в этой строке:

Image image = Image.getInstance("penguin.jpg");

Так как он находится в каталоге src, он окажется в файле JAR. Однако вы не можете напрямую загружать файлы из файла JAR только с именем файла.

Однако, Image.getInstance имеет перегрузку , которая принимает URL, что делает это довольно легко:

Image image = Image.getInstance(this.getClass().getResource("/penguin.jpg"));

/ - это корень каталога или файлов jar src, а не корень файловой системы, если вам интересно.

0 голосов
/ 01 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...