项目在eclipse中工作,但在导出时不工作

时间:2010-06-09 16:37:47

标签: java eclipse export

我编写了一个应用程序,它根据DOT语法使用GraphViz生成一些图形为.gif。当我从Eclipse运行时,图像生成正常但是当我将其导出为jar时,图像被创建但是没有数据。当我在Microsoft Picture Viewer中查看它时,它只是红色的X。

它作为一个导出的jar工作,直到我将图片生成放在自己的线程中。我似乎无法弄清楚这里发生了什么。导出多线程项目有什么问题吗?有人有什么想法吗?

由于

以下是一些代码。很难确定出现了什么问题。

/**
* Writes the graph's image in a file.
* @param img   A byte array containing the image of the graph.
* @param to    A File object to where we want to write.
* @return Success: 1, Failure: -1
*/

public int writeGraphToFile(byte[] img, File to)
   {
      try {
         FileOutputStream fos = new FileOutputStream(to);
         fos.write(img);
         fos.close();
      } catch (java.io.IOException ioe) { return -1; }
      return 1;
   }

通过此调用从备用线程调用上述函数。

public void generateMainGraph() {
        //create the graph and put it to file name mainGraphCount.gif
        GraphViz gv = new GraphViz();
        System.out.println("Generating MAIN graph...");

        //add the ending } to mainDot
        mainDot += "}";

        File newGraph = new File("graphs\\main" + Integer.toString(mainGraphCount) + ".gif");
        gv.writeGraphToFile(gv.getGraph(mainDot), newGraph);
}

这是调用函数的线程,该函数调用generateMainGraph(...)。

graphGeneratingThread = new Runnable() {
            //This method will run in the timer thread
            public void run() {
                try {
                    //Generate the graphs
                    if (iData.importDataSet()) {
                        int timeout = 0;
                        Scanner scan = new Scanner(graphGen.logSource);
                        while(timeout < 10) {
                            if(!scan.hasNextLine()) {
                                Thread.sleep(1000);
                                timeout++;
                            } else {
                                timeout = 0;
                                graphGen.generateGraph(scan.nextLine());   //This function calls generateMainGraph(...)
                                if(!beginningButton.isEnabled()) {
                                    enableTivoButtons();
                                }
                            }
                        }
                    }
                } catch(Exception exc) {
                    System.err.println("GraphGenerationThread Runnable Error: " + exc.getMessage() + "\n");
                    exc.printStackTrace();
                    System.exit(1);
                }
            }
        };

2 个答案:

答案 0 :(得分:1)

检查Eclipse中的类路径。您可能在Eclipse之外的路径中遗漏了一个jar。您可以在罐子的清单中列出所需的罐子。

答案 1 :(得分:1)

如果项目在导出时是多线程的,那么它没有区别。差异是由VM如何调度线程引起的(可能通过在eclipse中运行来实现)。

由于你的问题是使用线程版本,我猜你有内部对象状态,在另一个线程的一个线程的操作过程中被破坏。例如:

  1. 线程A生成图像数据
  2. 线程B用空的数据替换数据数组
  3. 线程A写入数据(现在从步骤2开始为空)
  4. 这将是对0字节图像的解释。另一种情况:

    1. 线程A开始生成图像数据
    2. 线程B开始生成图像数据
    3. 线程A完成生成数据。
    4. 线程A写入图像数据(现在包含线程B数据的一部分)
    5. 这可能是图像文件损坏的原因。调试并发代码可能很棘手。我的建议是:

      1. 查找可以由多个线程同时调用的任何代码。
      2. 添加日志语句,包括Thread.currentThread()。getName(),如果它还不是您正在使用的日志记录API的一部分。
      3. 查看两个线程的交错,这应该可以让您了解数据可能会损坏的位置。
      4. 如果您在找到可以由多个线程同时运行的代码并且影响您的数据之后只是使该方法同步,那么您正在寻找一个“简单的解决方案”,但这可能会使您在添加时尝试实现的目标失败线程。