【问题标题】:BIRT Error : Unable to determine the default workspace location in JavaBIRT 错误:无法确定 Java 中的默认工作区位置
【发布时间】:2013-01-07 15:21:00
【问题描述】:

我收到以下错误

java.lang.IllegalStateException: Unable to determine the default workspace location.  Check your OSGi-less platform configuration of the plugin or datatools workspace path.

这没什么意义。

报告是使用 Eclipse 中的 BIRT 设计器创建的,我们正在使用代码将报告转换为 PDF。

代码看起来像

    final EngineConfig config = new EngineConfig();
    config.setBIRTHome("./birt");
    Platform.startup(config);
    final IReportEngineFactory factory = (IReportEngineFactory) Platform
            .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);

    final HTMLRenderOption ho = new HTMLRenderOption();
    ho.setImageHandler(new HTMLCompleteImageHandler());
    config.setEmitterConfiguration(RenderOption.OUTPUT_FORMAT_HTML, ho);
    // Create the engine.
    this.engine = factory.createReportEngine(config);
    final IReportRunnable report = this.engine.openReportDesign(reportName);
    final IRunAndRenderTask task = this.engine.createRunAndRenderTask(report);
    final RenderOption options = new HMTLRenderOption();
    options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);
    options.setOutputFormat("pdf");
    final String output = reportName.replaceFirst(".rptdesign", ".xls");
    final String output = name.replaceFirst(".rptdesign", "." + HTMLRenderOption.OUTPUT_FORMAT_PDF);
    options.setOutputFileName( outputReporttName);
    task.setRenderOption(options);


    // Run the report.
    task.run();

但似乎在 task.run() 方法期间,系统抛出了错误。

这需要能够独立运行,而不需要 Eclipse,并且希望 BIRT 主页的设置会让它开心,但这些似乎是我不知道并且可能不需要的其他一些连接配置文件.

完整的错误:

07-Jan-2013 14:55:31 org.eclipse.datatools.connectivity.internal.ConnectivityPlugin log
SEVERE: Unable to determine the default workspace location.  Check your OSGi-less      platform configuration of the plugin or datatools workspace path.
07-Jan-2013 14:55:31 org.eclipse.birt.report.engine.api.impl.EngineTask handleFatalExceptions
SEVERE: An error happened while running the report. Cause:
java.lang.IllegalStateException: Unable to determine the default workspace location.  Check your OSGi-less platform configuration of the plugin or datatools workspace path.
at org.eclipse.datatools.connectivity.internal.ConnectivityPlugin.getDefaultStateLocation(ConnectivityPlugin.java:155)
at org.eclipse.datatools.connectivity.internal.ConnectivityPlugin.getStorageLocation(ConnectivityPlugin.java:191)
at org.eclipse.datatools.connectivity.internal.ConnectionProfileMgmt.getStorageLocation(ConnectionProfileMgmt.java:1060)
at org.eclipse.datatools.connectivity.oda.profile.internal.OdaProfileFactory.defaultProfileStoreFile(OdaProfileFactory.java:170)
at org.eclipse.datatools.connectivity.oda.profile.OdaProfileExplorer.defaultProfileStoreFile(OdaProfileExplorer.java:138)
at org.eclipse.datatools.connectivity.oda.profile.OdaProfileExplorer.loadProfiles(OdaProfileExplorer.java:292)
at org.eclipse.datatools.connectivity.oda.profile.OdaProfileExplorer.getProfileByName(OdaProfileExplorer.java:537)
at org.eclipse.datatools.connectivity.oda.profile.provider.ProfilePropertyProviderImpl.getConnectionProfileImpl(ProfilePropertyProviderImpl.java:184)
at org.eclipse.datatools.connectivity.oda.profile.provider.ProfilePropertyProviderImpl.getDataSourceProperties(ProfilePropertyProviderImpl.java:64)
at org.eclipse.datatools.connectivity.oda.consumer.helper.ConnectionPropertyHandler.getEffectiveProperties(ConnectionPropertyHandler.java:123)
at org.eclipse.datatools.connectivity.oda.consumer.helper.OdaConnection.getEffectiveProperties(OdaConnection.java:826)
at org.eclipse.datatools.connectivity.oda.consumer.helper.OdaConnection.open(OdaConnection.java:240)
at org.eclipse.birt.data.engine.odaconsumer.ConnectionManager.openConnection(ConnectionManager.java:165)
at org.eclipse.birt.data.engine.executor.DataSource.newConnection(DataSource.java:224)
at org.eclipse.birt.data.engine.executor.DataSource.open(DataSource.java:212)
at org.eclipse.birt.data.engine.impl.DataSourceRuntime.openOdiDataSource(DataSourceRuntime.java:217)
at org.eclipse.birt.data.engine.impl.QueryExecutor.openDataSource(QueryExecutor.java:407)
at org.eclipse.birt.data.engine.impl.QueryExecutor.prepareExecution(QueryExecutor.java:317)
at org.eclipse.birt.data.engine.impl.PreparedQuery.doPrepare(PreparedQuery.java:455)
at org.eclipse.birt.data.engine.impl.PreparedDataSourceQuery.produceQueryResults(PreparedDataSourceQuery.java:190)
at org.eclipse.birt.data.engine.impl.PreparedDataSourceQuery.execute(PreparedDataSourceQuery.java:178)
at org.eclipse.birt.data.engine.impl.PreparedOdaDSQuery.execute(PreparedOdaDSQuery.java:145)
at org.eclipse.birt.report.data.adapter.impl.DataRequestSessionImpl.execute(DataRequestSessionImpl.java:624)
at org.eclipse.birt.report.engine.data.dte.DteDataEngine.doExecuteQuery(DteDataEngine.java:152)
at org.eclipse.birt.report.engine.data.dte.AbstractDataEngine.execute(AbstractDataEngine.java:267)
at org.eclipse.birt.report.engine.executor.ExecutionContext.executeQuery(ExecutionContext.java:1939)
at org.eclipse.birt.report.engine.executor.QueryItemExecutor.executeQuery(QueryItemExecutor.java:80)
at org.eclipse.birt.report.engine.executor.TableItemExecutor.execute(TableItemExecutor.java:62)
at org.eclipse.birt.report.engine.internal.executor.dup.SuppressDuplicateItemExecutor.execute(SuppressDuplicateItemExecutor.java:43)
at org.eclipse.birt.report.engine.internal.executor.wrap.WrappedReportItemExecutor.execute(WrappedReportItemExecutor.java:46)
at org.eclipse.birt.report.engine.internal.executor.l18n.LocalizedReportItemExecutor.execute(LocalizedReportItemExecutor.java:34)
at org.eclipse.birt.report.engine.layout.html.HTMLBlockStackingLM.layoutNodes(HTMLBlockStackingLM.java:65)
at org.eclipse.birt.report.engine.layout.html.HTMLPageLM.layout(HTMLPageLM.java:92)
at org.eclipse.birt.report.engine.layout.html.HTMLReportLayoutEngine.layout(HTMLReportLayoutEngine.java:100)
at org.eclipse.birt.report.engine.api.impl.RunAndRenderTask.doRun(RunAndRenderTask.java:180)
at org.eclipse.birt.report.engine.api.impl.RunAndRenderTask.run    (RunAndRenderTask.java:77)

有没有人看到这个错误并且可以指出正确的方向?

【问题讨论】:

    标签: java birt


    【解决方案1】:

    当我遇到这个问题时,我尝试了两件事。第一件事解决了错误,然后我又遇到了下一个错误。

    我尝试的第一件事是将 setenv.sh 文件设置为具有以下行: export CATALINA_OPTS="$CATALINA_OPTS -Djava.io.tmpdir=/opt/local/share/tomcat/apache-tomcat-8.0.8/temp/tmpdir -Dorg.eclipse.datatools_workspacepath=/opt/local/share/tomcat/apache-tomcat-8.0.8/temp/tmpdir/workspace_dtp"

    在我在本地 tomcat 服务器中创建 tmpdirworkspace_dtp 目录后,此解决方案有效。这是为了响应here 的指导。

    但是,我刚刚遇到下一个错误,即连接配置文件错误。如果你需要,我可以再看看。我知道如何复制这个问题。

    我尝试的第二件事最终完全解决了这个问题,这与我们的报表设计者在报表设计过程中选择了错误的数据源类型有关。完整的故事请参见我在 Eclipse BIRT 论坛上的帖子:post

    基本上,报告类型设置为“查询生成器的 JDBC 数据库连接”,而它本应设置为“JDBC 数据源”。参考图片见:

    【讨论】:

      【解决方案2】:

      在这里,我给你一个提示,让我摆脱痛苦: 只需在安装 BIRT 插件后使用“-clean”选项启动 eclipse。

      需要明确的是,我的项目是从 BIRT maven 依赖项构建的,因此不应使用 eclipse 依赖项来运行(设计报告除外),但是......我认为某处存在冲突......尤其是与 org. eclipse.datatools.connectivity_1.2.4.v201202041105.jar

      为了全局理解,您应该遵循迁移指南: http://wiki.eclipse.org/Birt_3.7_Migration_Guide#Connection_Profiles

      它有助于使用连接配置文件来外部化数据源参数。 所以直接在报表设计中定义JDBC参数就不需要了。

      【讨论】:

      • 我会看看,但我没有使用 3.7,所以没有迁移。我正在使用 4.2,但会阅读有关连接配置文件的更多信息。
      • 您的问题解决了吗?我也面临同样的问题,你可以检查一下网址eclipse.org/forums/index.php/m/1689369/#msg_1689369
      • @Prathyush 如果可以帮助您绕过连接配置文件限制,您可以通过一段代码看到我的新答案(请参阅 forceDataSource)
      【解决方案3】:

      我使用这种编程方式来初始化工作空间目录:

      @Override
      public void initializeEngine() throws BirtException {
          // define eclipse datatools workspace path (required)
          String workspacePath = setDataToolsWorkspacePath();
      
          // set configuration
          final EngineConfig config = new EngineConfig();
          config.setLogConfig(workspacePath, Level.WARNING);
      
          // config.setResourcePath(getSqlDriverClassJarPath());
      
          // startup OSGi framework
          Platform.startup(config); // really needed ?
          IReportEngineFactory factory = (IReportEngineFactory) Platform
                  .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
          engine = factory.createReportEngine(config);
          engine.changeLogLevel(Level.WARNING);
      }
      
      private String setDataToolsWorkspacePath() {
          String workspacePath = System.getProperty(DATATOOLS_WORKSPACE_PATH);
          if (workspacePath == null) {
              workspacePath = FilenameUtils.concat(SystemUtils.getJavaIoTmpDir().getAbsolutePath(), "workspace_dtp");
              File workspaceDir = new File(workspacePath);
              if (!workspaceDir.exists()) {
                  workspaceDir.mkdir();
              }
              if (!workspaceDir.canWrite()) {
                  workspaceDir.setWritable(true);
              }
              System.setProperty(DATATOOLS_WORKSPACE_PATH, workspacePath);
          }
          return workspacePath;
      }
      

      我还需要以这种方式在运行时强制数据源参数:

      private void generateReportOutput(InputStream reportDesignInStream, File outputFile, OUTPUT_FORMAT outputFormat,
              Map<PARAM, Object> params) throws EngineException, SemanticException {
          // Open a report design
          IReportRunnable design = engine.openReportDesign(reportDesignInStream);
      
          // Use data-source properties from persistence.xml
          forceDataSource(design);
      
          // Create RunAndRender task
          IRunAndRenderTask runTask = engine.createRunAndRenderTask(design);
      
          // Use data-source from JPA persistence context
          // forceDataSourceConnection(runTask);
      
          // Define report parameters
          defineReportParameters(runTask, params);
      
          // Set render options
          runTask.setRenderOption(getRenderOptions(outputFile, outputFormat, params));
      
          // Execute task
          runTask.run();
      }
      
      private void forceDataSource(IReportRunnable runableReport) throws SemanticException {
          DesignElementHandle designHandle = runableReport.getDesignHandle();
      
          Map<String, String> persistenceProperties = PersistenceUtils.getPersistenceProperties();
          String dsURL = persistenceProperties.get(AvailableSettings.JDBC_URL);
          String dsDatabase = StringUtils.substringAfterLast(dsURL, "/");
          String dsUser = persistenceProperties.get(AvailableSettings.JDBC_USER);
          String dsPass = persistenceProperties.get(AvailableSettings.JDBC_PASSWORD);
          String dsDriver = persistenceProperties.get(AvailableSettings.JDBC_DRIVER);
      
          SlotHandle dataSources = ((ReportDesignHandle) designHandle).getDataSources();
          int count = dataSources.getCount();
          for (int i = 0; i < count; i++) {
              DesignElementHandle dsHandle = dataSources.get(i);
              if (dsHandle != null && dsHandle instanceof OdaDataSourceHandle) {
                  // replace connection properties from persistence.xml
                  dsHandle.setProperty("databaseName", dsDatabase);
                  dsHandle.setProperty("username", dsUser);
                  dsHandle.setProperty("password", dsPass);
                  dsHandle.setProperty("URL", dsURL);
                  dsHandle.setProperty("driverClass", dsDriver);
                  dsHandle.setProperty("jarList", getSqlDriverClassJarPath());
                  // @SuppressWarnings("unchecked")
                  // List<ExtendedProperty> privateProperties = (List<ExtendedProperty>) dsHandle
                  // .getProperty("privateDriverProperties");
                  // for (ExtendedProperty extProp : privateProperties) {
                  // if ("odaUser".equals(extProp.getName())) {
                  // extProp.setValue(dsUser);
                  // }
                  // }
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题

        将数据源类型从“用于查询生成器的 JDBC 数据库连接”更改为“JDBC 数据源”解决了我的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-24
          • 1970-01-01
          • 2011-02-03
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          • 1970-01-01
          相关资源
          最近更新 更多