Java 如何查询JBossAS7上的现有应用程序?

Java 如何查询JBossAS7上的现有应用程序?,java,jboss,jenkins,jboss7.x,continuous-delivery,Java,Jboss,Jenkins,Jboss7.x,Continuous Delivery,我正致力于从Jenkins构建服务器自动部署到远程JBoss AS 7.1.1服务器,作为构建管道的一部分,并且有一个我从ant调用的小jar文件(基于) 我的问题是如何确定应用程序是否已安装?如果应用程序已经部署,那么执行部署计划将失败(我可以捕获抛出的异常,但这不是很好)。您可以在执行部署之前读取资源。从那里你可以重新部署它或者什么都不做 下面是一个在独立服务器上工作的示例 private boolean exists(final ModelControllerClient client,

我正致力于从Jenkins构建服务器自动部署到远程JBoss AS 7.1.1服务器,作为构建管道的一部分,并且有一个我从ant调用的小jar文件(基于)


我的问题是如何确定应用程序是否已安装?如果应用程序已经部署,那么执行部署计划将失败(我可以捕获抛出的异常,但这不是很好)。

您可以在执行部署之前读取资源。从那里你可以重新部署它或者什么都不做

下面是一个在独立服务器上工作的示例

private boolean exists(final ModelControllerClient client, final String deploymentName) {
    final ModelNode op = new ModelNode();
    op.get(OP).set("read-children-names");
    op.get("child-type").set(ClientConstants.DEPLOYMENT);
    final ModelNode result;
    try {
        result = client.execute(op);
        // Check to make sure there is an outcome
        if (result.hasDefined(ClientConstants.OUTCOME)) {
            if (result.get(ClientConstants.OUTCOME).asString().equals(ClientConstants.SUCCESS)) {
                final List<ModelNode> deployments = (result.hasDefined(ClientConstants.RESULT) ? result.get(ClientConstants.RESULT).asList() : Collections.<ModelNode>emptyList());
                for (ModelNode n : deployments) {
                    if (n.asString().equals(deploymentName)) {
                        return true;
                    }
                }
            } else if (result.get(ClientConstants.OUTCOME).asString().equals(ClientConstants.FAILED)) {
                throw new IllegalStateException(String.format("A failure occurred when checking existing deployments. Error: %s",
                        (result.hasDefined(ClientConstants.FAILURE_DESCRIPTION) ? result.get(ClientConstants.FAILURE_DESCRIPTION).asString() : "Unknown")));
            }
        } else {
            throw new IllegalStateException(String.format("An unexpected response was found checking the deployment. Result: %s", result));
        }
    } catch (IOException e) {
        throw new IllegalStateException(String.format("Could not execute operation '%s'", op), e);
    }
    return false;
}
存在私有布尔值(最终ModelControllerClient,最终String deploymentName){
final ModelNode op=new ModelNode();
op.get(op.set)(“读取子项名称”);
op.get(“子类型”).set(ClientConstants.DEPLOYMENT);
最终模型节点结果;
试一试{
结果=client.execute(op);
//检查以确保有结果
if(result.hasDefined(ClientConstants.output)){
if(result.get(ClientConstants.output).asString().equals(ClientConstants.SUCCESS)){
最终列表部署=(result.hasDefined(ClientConstants.result)→result.get(ClientConstants.result).asList():Collections.emptyList());
用于(ModelNode n:部署){
if(n.asString().equals(deploymentName)){
返回true;
}
}
}else if(result.get(ClientConstants.output).asString().equals(ClientConstants.FAILED)){
抛出新的IllegalStateException(String.format)(“检查现有部署时出错。错误:%s”,
(result.hasDefined(ClientConstants.FAILURE_DESCRIPTION)?result.get(ClientConstants.FAILURE_DESCRIPTION.asString():“未知”);
}
}否则{
抛出新的IllegalStateException(String.format(“在检查部署时发现意外响应。结果:%s”,结果));
}
}捕获(IOE异常){
抛出新的IllegalStateException(String.format(“无法执行操作“%s”,op),e);
}
返回false;
}
如果您使用的是maven,那么您也可以使用它。

另一种选择:

ModelNode res = AS7CliUtils.executeRequest("/deployment=* /:read-resource", ctx.getAS7Client() );

{
    "outcome" => "success",
    "result" => [{
        "address" => [("deployment" => "jboss-as-wicket-ear-ear.ear")],
        "outcome" => "success",
        "result" => {
            "content" => [{"hash" => bytes { ... }}],
            "enabled" => true,
            "name" => "jboss-as-wicket-ear-ear.ear",
            "persistent" => true,
            "runtime-name" => "jboss-as-wicket-ear-ear.ear",
            "subdeployment" => {
                "jboss-as-wicket-ear-ejb.jar" => undefined,
                "jboss-as-wicket-ear-war.war" => undefined
            },
            "subsystem" => {"datasources" => undefined}
        }
    }]
}
JBoss AS CLI客户端库包含一些用于此目的的API,目前无法找到它

这是查询解析的基本实现(不支持嵌套值,也不关心转义等)

/**
*将CLI命令解析为ModelNode-/foo=a/bar=b/:操作(param=value,…)。
* 
*TODO:支持嵌套参数。
*/
公共静态模型节点解析命令(字符串命令){
返回parseCommand(command,true);
}
公共静态ModelNode parseCommand(字符串命令,布尔needOp){
String[]parts=StringUtils.split(命令“:”);
如果(needOp&&parts.length<2)抛出新的IllegalArgumentException(“缺少CLI命令操作:“+命令”);
字符串地址=零件[0];
ModelNode query=newmodelnode();
//地址
String[]partsAddr=StringUtils.split(addr,“/”);
用于(字符串段:partsAddr){
String[]partsSegment=StringUtils.split(段“=”,2);
如果(partsSegment.length!=2)抛出新的IllegalArgumentException(“错误的地址段格式-需要“=”:“+命令);
get(ClientConstants.OP_ADDR).add(partsSegment[0],partsSegment[1]);
}
//没有行动?
if(parts.length<2)返回查询;
//Op
String[]partsOp=StringUtils.split(parts[1],'(');
字符串opName=partsOp[0];
get(ClientConstants.OP).set(opName);
//操作参数
如果(零件SOP.长度>1){
字符串args=StringUtils.removeEnd(partsOp[1],“”);
for(字符串arg:args.split(“,”)){
字符串[]partsArg=arg.split(“=”,2);
query.get(partsArg[0]).set(unquote(partsArg[1]);
}
}
返回查询;
}//parseCommand()

没有maven,只有ant。谢谢你,我明天会试试的。这种东西的文档在哪里?@BedwyrHumphreys,大部分都在这里。其他的,你只需要探索一下结构。如果您执行$JBOSS_HOME/bin/JBOSS-cli.sh--connect“/:read resource”>>output.txt,您可以看到一个概览。我认为op.get(op)应该是op.get(ClientConstants.op),而ClientConstants.FAILED似乎不存在于org.JBOSS.as.controller.client.helpers.ClientConstantsOops中,很好的捕获。很抱歉,我复制并粘贴了其他代码:-)是的,我主要是从那里复制的。我试图修改以适应工作,但显然我错过了一些东西。但是,嘿,我确实写了maven插件;-)
/**
 *  Parse CLI command into a ModelNode - /foo=a/bar=b/:operation(param=value,...) .
 * 
 *  TODO: Support nested params.
 */
public static ModelNode parseCommand( String command ) {
   return parseCommand( command, true );
}
public static ModelNode parseCommand( String command, boolean needOp ) {
    String[] parts = StringUtils.split( command, ':' );
    if( needOp && parts.length < 2 )  throw new IllegalArgumentException("Missing CLI command operation: " + command);
    String addr = parts[0];

    ModelNode query = new ModelNode();

    // Addr
    String[] partsAddr = StringUtils.split( addr, '/' );
    for( String segment : partsAddr ) {
        String[] partsSegment = StringUtils.split( segment, "=", 2);
        if( partsSegment.length != 2 )  throw new IllegalArgumentException("Wrong addr segment format - need '=': " + command);
        query.get(ClientConstants.OP_ADDR).add( partsSegment[0], partsSegment[1] );
    }

    // No op?
    if( parts.length < 2 )  return query;

    // Op
    String[] partsOp = StringUtils.split( parts[1], '(' );
    String opName = partsOp[0];
    query.get(ClientConstants.OP).set(opName);

    // Op args
    if( partsOp.length > 1 ){
        String args = StringUtils.removeEnd( partsOp[1], ")" );
        for( String arg : args.split(",") ) {
            String[] partsArg = arg.split("=", 2);
            query.get(partsArg[0]).set( unquote( partsArg[1] ) );
        }
    }
    return query;
}// parseCommand()