Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
A mudança de versão do Java pode parecer uma tarefa rotineira, mas ela frequentemente traz surpresas que pegam até desenvolvedores experientes. Uma das questões mais recorrentes ao migrar de JDK 17 para 21 é o aparecimento de avisos relacionados ao carregamento dinâmico de agentes, especialmente ao executar testes automatizados. O problema é mais do que uma mera mensagem de aviso. ele sinaliza uma mudança de comportamento que pode comprometer sua rotina de testes e, por consequência, a estabilidade do seu pipeline de integração contínua.
Quando atualizamos o JDK, especialmente nas versões mais recentes, o Java passou a reforçar o controle sobre o carregamento de agentes dinâmicos. Esses agentes, como o byte-buddy-agent ou mesmo o Mockito, são essenciais para testes unitários, mocks e instrumentações específicas. No entanto, versões mais novas do Java, a partir do JEP 451, passaram a desencorajar o carregamento dinâmico sem as devidas flags. Assim, ao rodar testes com ferramentas como o Maven ou IntelliJ, aparecem avisos de que um agente foi carregado de forma dinâmica, além de alertas de que esse comportamento será descontinuado.
Este aviso não é só um incômodo, ele aponta para uma mudança de política de segurança e estabilidade do ambiente Java. Ignorá-lo pode gerar problemas na compatibilidade futura, além de dificultar a manutenção de um ambiente de testes confiável.
A causa raiz está na implementação de novas políticas de segurança na JVM, que restringem o carregamento dinâmico de agentes por padrão. Isso acontece porque agentes carregados de forma dinâmica podem mascarar problemas de compatibilidade ou esconder comportamentos inesperados. Além disso, o JEP 451 reforça que, nas próximas versões, essa prática será ainda mais limitada, exigindo flags específicas ou uma abordagem diferente.
No seu caso, ao usar o IntelliJ, o carregamento automático do agente ocorre ao clicar na execução do teste. Como a ferramenta não usa o mesmo processo de build, ela não herda as configurações de flags de JVM configuradas no Maven, por exemplo. Assim, os avisos aparecem e permanecem, mesmo após atualizações.
A melhor abordagem é configurar corretamente o carregamento do agente na sua ferramenta de build ou IDE. Para Maven, por exemplo, usar o plugin de dependências e configurar o argLine do surefire para incluir o parâmetro -javaagent: apontando para a versão exata do seu agente. Isso evita o carregamento dinâmico não controlado. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Para quem usa IntelliJ, a solução é editar a configuração de execução do seu teste, adicionando os argumentos de VM, incluindo o -javaagent: com o caminho completo para o JAR do agente. É importante que esse caminho seja explicitamente definido, preferencialmente usando variáveis de ambiente ou propriedades que facilitem a manutenção. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Exemplo de configuração:
-javaagent:$MAVEN_REPOSITORY$/org/mockito/mockito-core/5.14.2/mockito-core-5.14.2.jar
Essa abordagem garante que o agente seja carregado de forma controlada e compatível, evitando os avisos e preparando seu ambiente para futuras versões do Java.
Optar por configurar explicitamente o carregamento de agentes traz benefícios claros, mas também alguns trade-offs. Primeiro, é preciso manter os caminhos atualizados com as versões corretas. Mudanças de versão das dependências exigirão ajustes nas configurações. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Segundo, o uso de flags como -XX:+EnableDynamicAgentLoading pode mascarar o problema, mas não resolve a raiz da questão, que é a mudança de política do Java. Além disso, deixar esse comportamento habilitado pode abrir brechas de segurança ou dificultar o diagnóstico de problemas. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Por fim, o maior cuidado deve ser com o controle de versões e automações de build, garantindo que o ambiente de testes seja reproduzível e consistente. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Migrar para o JDK 21 exige atenção redobrada à configuração de agentes, sobretudo na execução de testes automatizados. Configurar explicitamente o carregamento de agentes na sua ferramenta de build ou IDE é a estratégia mais segura para evitar avisos e problemas futuros. Assim, você garante uma transição mais tranquila, alinhada às mudanças de política do Java, e mantém a estabilidade do seu pipeline de testes. O que você tem feito para lidar com esses ajustes na sua equipe? Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Carregando comentários...