Anexar a VM remota (não local)

A API Java Attach pode se conectar a VMs locais e carregar agentes para ela. Como posso me conectar à VM em outro computador para carregar o agente?

Eu sei sobre o JMX. Mas não descobri como carregar meu agente personalizado na VM remota.

Talvez existam outras maneiras de resolver o meu problema (para carregar e executar código personalizado (agente) para a VM remota)?

upd. Eu quero executar código personalizado na JVM remota. A independência dos parâmetros iniciais da JVM é mais.

Obrigado.

3
Qual é o problema original que você precisa resolver dessa maneira?
adicionado o autor Thorbjørn Ravn Andersen, fonte
Eu vou desencorajar fortemente o uso de agentes para atualização de software. Imagine os problemas de suporte que você pode obter com isso.
adicionado o autor Thorbjørn Ravn Andersen, fonte
anexo, monitoramento e atualização de código em JVMs limpas de execução remota
adicionado o autor Andrew Kondratovich, fonte

3 Respostas

Não há problema em executar um servidor de aplicativos (Tomcat) em produção, mesmo com depuração remota conectada .

ATUALIZAR

Se você quiser executar código personalizado dentro do seu aplicativo, então uma solução seria escrever uma classe e compilá-la, armazená-la em algum lugar no servidor e, em seguida, dentro do seu aplicativo, executar algum método como este:

/**
 * This method:
 * 
  • loads a class from the server file system *
    • does a lookup for the method to execute *
    • creates a new instance of the specified class *
    • executes the given method with the given arguments * (which can be null if the method doesn't have arguments) *
    • returns the result of the invoked method * * @param classUrlOnTheServer * @param className * @param methodNameToExecute * @param argumentsForTheMethod arguments that should be passed to * the method of the loaded class - can * be null. * @return returns the result of the invoked method * @throws ClassNotFoundException * @throws MalformedURLException * @throws SecurityException * @throws NoSuchMethodException * @throws InstantiationException * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ public static Object loadAndExecuteCustomMethodFromALoadedClass(String classUrlOnTheServer, String className, String methodNameToExecute, Object ... argumentsForTheMethod) throws ClassNotFoundException, MalformedURLException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { File file = new File(classUrlOnTheServer); URL url = file.toURI().toURL(); URL[] urls = new URL[] { url }; ClassLoader cl = new URLClassLoader(urls); Class clazz = cl.loadClass(className); Method method = clazz.getDeclaredMethod(methodNameToExecute); Object instance = clazz.newInstance(); Object result = method.invoke(instance, argumentsForTheMethod); return result; }
  • 2
    adicionado
    Com a depuração remota, você pode avaliar expressões (linhas inteiras de código). Você não pode salvar esse código, mas pode alterar valores de campos e variáveis. Eu não entendo completamente o que você não quer, você pode por favor editar sua pergunta inicial e explicar em detalhes.
    adicionado o autor davorp, fonte
    Eu atualizei minha resposta ...
    adicionado o autor davorp, fonte
    Eu preciso injetar código personalizado. Com o JMX, posso obter informações sobre a JVM remota, mas não consigo injetar e executar código. Anexar API fornece maneiras de carregar o agente executável na JVM, mas apenas a JVM local. Eu estou procurando a maneira de fazer o mesmo com a JVM remota.
    adicionado o autor Andrew Kondratovich, fonte
    atualizado como você deseja.
    adicionado o autor Andrew Kondratovich, fonte

    Eu não entendi a pergunta, você quer apenas se conectar a uma VM remota? Quando conectado você pode executar o que quiser, o evento termina a VM. Você precisa iniciar sua VM no modo de depuração:

    -Xdebug -Xrunjdwp: transport = dt_socket, endereço = 8000, servidor = y, suspender = n

    Then in Eclipse for example, create a new remote application profile. check this : http://www.ibm.com/developerworks/opensource/library/os-eclipse-javadebug/index.html

    0
    adicionado
    Eu sei sobre interfaces de depuração, mas eu preciso disso para produção, não para depuração.
    adicionado o autor Andrew Kondratovich, fonte

    Eu encontrei solução experimental: jsadebugd .
    Em seguida, você pode conectá-lo ao conector sun.jvm.hotspot.jdi.SAPIDAttachingConnector .

    0
    adicionado
    O que você quer dizer? Quantos passos?
    adicionado o autor Nick Dong, fonte
    Você resolveu isso em um programa? @Andrew Knodratovich
    adicionado o autor Nick Dong, fonte
    Eu tenho o mesmo problema com você. Como anexar um jvm remoto e injetar código usando o programa sem reiniciar o jvm remoto para adicionar alguns argumentos de depuração?
    adicionado o autor Nick Dong, fonte