Melhor hotswap ao depurar remotamente uma JVM

https://blog.payara.fish/using-hotswapagent-to-speed-up-development

Introdução ao HotswapAgent
O próprio HotswapAgent é apenas um agente java, que deve ser anexado ao aplicativo. Basicamente, ele verifica o caminho de classe para detectar a presença de estruturas conhecidas e tenta atualizá-las após a detecção de uma alteração de código ou recurso. Também é possível escrever plug-ins personalizados para qualquer projeto ou mesmo especificamente para seu aplicativo. No entanto, obter o máximo do HotswapAgent requer a instalação de um mecanismo DCEVM alternativo em sua instalação JRE, que faz um trabalho muito melhor no recarregamento de alterações de código do que o mecanismo VM padrão no HotSpot VM. O mecanismo VM alternativo é basicamente uma versão corrigida do mecanismo padrão, que melhora a troca a quente do código por meio da interface de depuração, sem impactar outras funções da JVM.

Para resumir, vamos fazer isso para trabalhar com HotSwap de nosso IDE de escolha:

Instale o mecanismo DCEVM em uma instalação Java (JRE ou JDK)
Configure o IDE para iniciar o aplicativo com o HotswapAgent JAR como agente java e usando o mecanismo DCEVM em vez do mecanismo JVM padrão
Configure o IDE para atualizar recursos de texto simples como XML, propriedade , no aplicativo em execução (isso deve ser feito pelo IDE porque não é compatível com o depurador Java)
Inicie o aplicativo no modo de depuração e conecte-se a ele por meio da interface do depurador dentro do IDE
Continue a codificação e veja as mudanças em seu aplicativo imediatamente
Instalando o motor DCEVM
Primeiro, baixe o instalador DCEVM para sua instalação Java. O projeto é muito rápido para lançar novas versões para novas atualizações do Java. No momento em que escrevi esta postagem no blog, havia uma versão para a atualização 144 do Java 8 disponível, lançada 12 dias atrás, apenas um mês após a atualização 144 do Java 8 real ter sido lançada. Não existem versões do DCEVM para cada atualização do Java, mas sempre uso a versão mais recente com a minha instalação do Java e nunca tive problemas com ela.

O instalador é um arquivo JAR executável simples, que pode ser iniciado com java -jar DCEVM-installer.jar. No Linux, geralmente começo com privilégios de administrador (usando sudo), porque ele adicionará / modificará arquivos na instalação Java, que geralmente é somente leitura para usuários padrão se instalado em todo o sistema: sudo java -jar DCEVM-installer. jarra

O instalador abrirá uma janela, que lista todas as instalações Java detectadas no sistema.

Hotswap agent blog 1.png

É possível instalar o motor DCEVM de 2 maneiras:

substitua o mecanismo VM atual por DCEVM
como um mecanismo alternativo em uma instalação Java, o que não afetará o comportamento padrão da JVM.
Se você instalar o DCEVM como um mecanismo alternativo, poderá ativá-lo passando a
linha de comando –XXaltjvm = dcevm opção para o comando java junto com as outras opções, como:

java –XXaltjvm = dcevm -Xmx500m -jar application.jar

Em geral, obtive êxito ao instalar o DCEVM como um mecanismo alternativo, que é menos intrusivo e muito transparente. O mecanismo DCEVM pode então ser ativado por uma opção de linha de comando apenas se você quiser e você pode ter a mesma instalação Java para ambos os programas Java de terceiros em execução e desenvolvimento.

A segunda opção de substituir o mecanismo VM atual por DCVEM é conveniente se você não puder passar argumentos de linha de comando adicionais para o programa Java. Nesse caso, eu recomendo usar uma instalação Java separada para substituir o mecanismo padrão por DCEVM e usá-lo apenas durante o desenvolvimento.

Configurar o IDE para usar HotswapAgent
Para habilitar o HotswapAgent, ele deve ser passado para o programa Java como um agente, por meio do parâmetro de linha -javaagentcommand. Em seguida, você deve passar parâmetros adicionais para habilitar o modo de depuração. Antes de configurar o IDE, explicarei como iniciar um aplicativo a partir da linha de comando, que é essencialmente o que você precisa configurar em qualquer IDE.

Primeiro, baixe o HotswapAgent JAR para algum local compartilhado. O arquivo JAR permanecerá lá e será referenciado pelo parâmetro de linha de comando -javaagent. Além disso, habilitaremos a depuração remota na porta 9009, com suspend = n para que o aplicativo não espere que o depurador seja anexado. Podemos então anexar um depurador a qualquer momento que quisermos atualizar o aplicativo com alterações de código. Este é um exemplo de linha de comando para iniciar um aplicativo com o HotswapAgent JAR localizado em /development/hotswap-agent.jar:

java -XXaltjvm = dcevm -javaagent: /development/hotswap-agent.jar
-agentlib: jdwp = transport = dt_socket, server = y, suspend = n, address = 9009
-jar application.jar

Se você não instalou o DCEVM como uma JVM alternativa, mas substituiu o mecanismo JVM padrão, deve omitir o argumento –XXaltjvm = dcevm.

Para configurar o HotswapAgent em seu IDE, você deve seguir os seguintes passos:

Certifique-se de que o IDE pode aplicar suas alterações de código por meio do depurador. Na maioria dos IDEs, isso significa que
a compilação automática ao salvar está ativada. As
classes compiladas são substituídas automaticamente no aplicativo em execução se estiver anexado ao IDE por meio da interface de depuração.
Certifique-se de que o IDE usa a instalação Java com o mecanismo
DCEVM se o DCEVM foi instalado como um mecanismo alternativo, o IDE deve passar o argumento –XXaltjvm = dcevm ao iniciar o aplicativo no modo de depuração.
Desligue qualquer reinicialização / reimplantação do aplicativo na alteração do código (isso se aplica principalmente ao usar servidores de aplicativos por meio de um plug-in de servidor IDE)
Instruções detalhadas sobre como fazer isso nos principais IDEs Java podem ser encontradas no HotswapAgent Wiki.

Usando HotswapAgent com Payara Server
Alguns frameworks ou servidores de aplicação requerem configuração adicional. Isso ocorre principalmente porque o hotswap-agent.jar deve ser adicionado ao classpath e o agente não é capaz de modificar o carregador de classe para adicionar as classes necessárias automaticamente, ou a estrutura ou servidor gera um processo JVM adicional e deve ser configurado para use uma JVM com DCEVM.

Para usar o HotswapAgent com DCEVM durante o desenvolvimento de aplicativos com Payara Server, as seguintes alterações são necessárias:

copie o hotswap-agent.jar para a pasta lib / ext no diretório de domínio do servidor Payara. Se você estiver usando o domínio domain1 padrão, seria glassfish / domains / domain1 / lib / ext / hotswap-agent.jar (isso é necessário para adicionar HotswapAgent JAR ao classpath do servidor, pelo menos até que HotswapAgent possa fazer isso automaticamente em Payara Server)
aponte o Payara Server para a instalação Java com o motor DCEVM, se não for a instalação padrão do sistema,
abra o arquivo glassfish / config / asenv.conf (ou glassfish / config / asenv.bat no Windows) e especifique que o ambiente AS_JAVA a variável aponta para a instalação Java,
modifique as opções JVM:
remova quaisquer opções -client ou -server JVM (elas impediriam o uso de DCEVM como um mecanismo alternativo mesmo se a opção –XXaltjvm estiver presente)
adicione a opção –XXaltjvm
adicione a opção -javaagent com o caminho para o hotswap-agent.jar, por exemplo, -javaagent: /development/hotswap-agent.jar. Ele pode fazer referência ao mesmo arquivo JAR que está na pasta lib / ext, mesmo usando uma referência relativa à pasta do domínio, como esta: -javaagent: $ {com.sun.aas.instanceRoot} / lib / ext / hotswap-agent .jar
Se iniciar o servidor Payara a partir do IDE, pode ser necessário aplicar as etapas 2. e 3. na configuração de seu IDE, porque o plug-in do servidor Payara na maioria dos IDEs ignora a configuração do servidor Payara padrão e inicia o servidor Payara com o tempo de execução Java e parâmetros de linha de comando especificados no IDE. Lembre-se de que, nesse caso, você deve usar o caminho completo para hotswap-agent.jar e evitar usar a variável $ {com.sun.aas.instanceRoot}.

No IDE, você também deve desabilitar a reimplantação automática do aplicativo na alteração do código. A maioria dos plug-ins IDE faz isso por padrão porque, em circunstâncias normais, é a única maneira confiável de atualizar o aplicativo para refletir as alterações do código. Como com HotSwapAgent e DCEVM o recarregamento de classe usual é suficiente, a reimplantação automática não é necessária e deve ser desativada.

Usando HotswapAgent com Payara Micro
Payara Micro é um aplicativo em tempo de execução que, ao contrário de servidores de aplicativos, é empacotado como um único arquivo JAR executável e pode ser iniciado como tal. Ele implementa aplicativos passados ​​como parâmetros de linha de comando, dentro do mesmo processo JVM. Portanto, é muito fácil iniciá-lo com o HotswapAgent da mesma forma que qualquer outro JAR executável:

java -XXaltjvm = dcevm -javaagent: /development/hotswap-agent.jar
-agentlib: jdwp = transport = dt_socket, server = y, suspend = n, address = 9009
-jar payara-micro.jar –deploy application- guerra

Depois de iniciado assim, ele escuta na porta 9009 as solicitações do depurador e qualquer IDE pode anexar seu depurador a ela.

O aplicativo da web é implantado a partir de um diretório explodido chamado application-war (não deve ser confundido com um pacote de arquivos war) para que as alterações em recursos como páginas XML ou JSF também sejam obtidas automaticamente. A maioria dos IDEs oferece suporte à construção de um aplicativo da web como um diretório explodido. O Maven também organiza o aplicativo em um diretório na pasta de destino antes de criar o arquivo WAR e você pode implantar o aplicativo a partir desse diretório usando Payara Micro.

Resumo: usando o HotswapAgent no NetBeans com o servidor Payara
Vou resumir rapidamente as etapas necessárias para fazer o HotswapAgent rodar com o servidor Payara a partir do NetBeans IDE.

Instale o DCEVM
Use o instalador DCEVM para instalar o DCEVM como uma VM alternativa em uma instalação Java (você pode precisar executar o instalador como administrador)
Configure o servidor Payara
Baixe o HotswapAgent JAR na pasta lib / ext no diretório de domínio do servidor Payara como lib / ext / hotswap-agent.jar
modifique as opções JVM:
remova qualquer opção -client ou -server JVM
adicione a opção –XXaltjvm
adicione o -javaagent: $ {com.sun.aas.instanceRoot} / lib / ext / hotswap-agent Opção .jar
Configurar NetBeans
No NetBeans, abra a configuração do serviço Payara Server e
certifique-se de que a instalação Java com o DCEVM esteja selecionada como a plataforma Java
não há como configurar as opções JVM – o plugin lê a configuração padrão do servidor Payara que modificamos anteriormente
Abra as propriedades do projeto
em Build -> Compile, certifique-se de que a opção Compile On Save esteja habilitada
em Run, certifique-se de que a opção Deploy on Save esteja desativado
Em Opções do Netbeans (Ferramentas -> Opções), em Java -> Depurador de Java, certifique-se de que Aplicar alterações de código após salvar esteja ativado.
Você também pode forçar a aplicação de alterações de código manualmente com o botão Aplicar alterações de código na barra de ferramentas de depuração durante a depuração
Agora, você pode depurar o aplicativo de maneira padrão no NetBeans. O IDE irá compilar automaticamente todas as classes, atualizando-as no servidor. Ele também copiará todos os recursos alterados em um diretório explodido que ele usou para implantar o aplicativo para que esses recursos sejam atualizados também, porque o servidor Payara monitora as alterações.

Resumo: Usando HotswapAgent no NetBeans com Payara Micro
As etapas a seguir o levarão a executar o HotswapAgent com Payara Micro e o NetBeans IDE:

Instale a DCEVM como uma VM alternativa (a mesma etapa do servidor Payara)
No NetBeans, abra as propriedades do projeto
em Build -> Compile, certifique-se de que a opção Compile On Save esteja habilitada
em NetBeans Options (Tools -> Options), em Java -> Depurador de Java, certifique-se de que Aplicar alterações de código após salvar esteja habilitado,
você também pode forçar a aplicação de alterações de código manualmente com o botão Aplicar alterações de código na barra de ferramentas de depuração durante a depuração
Descubra onde o NetBeans gera o diretório explodido de seu aplicativo (antes de empacotá-lo como um arquivo WAR)
para projetos maven, está na pasta de destino e tem o mesmo nome do arquivo WAR final, sem a extensão WAR.
Baixe o HotswapAgent JAR na mesma pasta que contém seu aplicativo explodido
Execute o aplicativo a partir do diretório explodido, com a seguinte linha de comando (supondo que o diretório do aplicativo explodido seja denominado application-war e que payara-micro.jar esteja na mesma pasta):
java -XXaltjvm = dcevm -javaagent: hotswap-agent .jar
-agentlib: jdwp = transport = dt_socket, server = y, suspend = n, address = 9009
-jar payara-micro.jar –deploy application-war

Anexe o depurador NetBeans ao aplicativo – menu Depurar -> Anexar depurador, use a porta 9009 como a porta de depuração