2011-10-14 35 views
4

我尝试启动hsqldb服务器进行开发使用。我有HSQLDB依赖:通过maven执行插件启动hsqldb服务器失败

<dependency> 
    <groupId>org.hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
    <version>2.2.4</version> 
</dependency> 

我在建的exec-Maven的构建:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>org.hsqldb.server.Server</mainClass> 
     <arguments> 
      <argument>--database.0 file:target/monitoring</argument> 
     </arguments> 
    </configuration> 
</plugin> 

我推出MVN高管:Java中,服务器开始,我有此错误:

[[email protected]]: [Thread[org.hsqldb.server.Server.main(),5,org.hsqldb.server.Server]]: Failed to set properties 
org.hsqldb.HsqlException: no valid database paths: maformed database enumerator: server.database.0 mem:monitoring 

我通过代码搜索,这个错误的含义是什么,我发现在hsqldb代码中的错误在这个页面上=>http://hsqldb.svn.sourceforge.net/viewvc/hsqldb/base/tags/2.2.5/src/org/hsqldb/server/Server.java?revision=4369&view=markup

private IntKeyHashMap getDBNameArray() { 

    final String prefix  = ServerProperties.sc_key_dbname + "."; 
    final int  prefixLen = prefix.length(); 
    IntKeyHashMap idToAliasMap = new IntKeyHashMap(); 
    Enumeration en   = serverProperties.propertyNames(); 

    for (; en.hasMoreElements();) { 
     String key = (String) en.nextElement(); 

     if (!key.startsWith(prefix)) { 
      continue; 
     } 

     int dbNumber; 

     try { 
      dbNumber = Integer.parseInt(key.substring(prefixLen)); 
     } catch (NumberFormatException e1) { 
      **printWithThread("maformed database enumerator: " + key);** 

      continue; 
     } 

     String alias = serverProperties.getProperty(key).toLowerCase(); 

     if (!aliasSet.add(alias)) { 
      printWithThread("duplicate alias: " + alias); 
     } 

     Object existing = idToAliasMap.put(dbNumber, alias); 

     if (existing != null) { 
      printWithThread("duplicate database enumerator: " + key); 
     } 
    } 

    return idToAliasMap; 
} 

所以HSQLDB作为一个重要参数都:“没有有效的数据库路径:maformed数据库枚举:server.database.0 MEM:监控

所以它看起来像一个bug,还是我做的东西错了?

好的,我找到了解决方案,我改变了我给exec maven插件的参数的方式。

从这个:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>org.hsqldb.server.Server</mainClass> 
     <arguments> 
      <argument>--database.0 file:target/monitoring</argument> 
     </arguments> 
    </configuration> 
</plugin> 

这样:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>org.hsqldb.server.Server</mainClass> 
     <arguments> 
      <argument>--database.0</argument> 
      <argument>file:target/monitoring</argument> 
     </arguments> 
    </configuration> 
</plugin> 

和它的作品

+0

OK通过命令行“mvn exec:java -Dexec.mainClass =”org.hsqldb.server.Server“-Dexec.args =” - database.0 file:target/monitoring“,它的工作原理类似于魅力,所以我的问题从EXEC-Maven的插件参数来 – Antoine

+0

我只是找到了解决方案,我替换此=> --database.0文件:/本 --database.0 监控 目标 file:target/monitoring Antoine

+1

请添加您的解答作为答案,以便其他人可以更容易地找到它。 – fredt

回答

9

我改变了我的参数传递给来自此exec Maven插件

方式:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>org.hsqldb.server.Server</mainClass> 
     <arguments> 
      <argument>--database.0 file:target/monitoring</argument> 
     </arguments> 
    </configuration> 
</plugin> 

这样:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>java</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <mainClass>org.hsqldb.server.Server</mainClass> 
     <arguments> 
      <argument>--database.0</argument> 
      <argument>file:target/monitoring</argument> 
     </arguments> 
    </configuration> 
</plugin> 

和它的作品

3

我发现,如果你需要从行家服务器模式启动HSQL并继续运行的集成测试,你必须用maven-antrun -plugin和蚂蚁Java的任务,因为高管 - Maven的插件不支持分叉模式:

 <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.6</version> 
     <dependencies> 
     </dependencies> 
     <executions> 
      <execution> 
      <phase>pre-integration-test</phase> 
      <configuration> 
       <target> 
       <property name="test_classpath" refid="maven.test.classpath" /> 
       <java classname="org.hsqldb.server.Server" 
        fork="yes" spawn="yes"> 
        <arg 
        line="--database.0 mem:test --dbname.0 test" /> 
        <classpath> 
        <pathelement path="${test_classpath}" /> 
        </classpath> 
       </java> 
       </target> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 

它假定你的HSQLDB依赖是测试范围。

+0

谢谢,那正是我需要的。令人难以置信的是,这不是由开箱即用的maven支持的。 –