Avaliação de código como ferramenta de depuração

Senhores, desenvolvedores de aplicativos java. Hoje, você encontra uma maneira simples de usar a avaliação de código, cuja implementação permitirá que código arbitrário seja executado em um aplicativo em execução, o que, por sua vez, economizará muito tempo de CI / CD.





Por que eu preciso disso?

Se você tiver que desenvolver em uma arquitetura de microsserviço, especialmente em uma grande empresa, provavelmente já está familiarizado com a situação quando pode ver como um aplicativo funciona "em combate" apenas em estandes onde há integrações com outros microsserviços. E uma vez que nem todas as coisas podem ser verificadas localmente em stubs, para testar uma hipótese específica, você deve enviar um novo código (não o fato de que funciona corretamente) no repositório ... executá-lo através de CI / CD ... e só então por meio de logs para entender que em algum lugar algo deu errado. E é bom que os registros mostrem imediatamente onde você estava errado, porque caso contrário, esse processo de empurrar e correr ao longo dos pipelines pode se tornar o seu ciclo do samsara.





A execução do código inserido dinamicamente ajudará a resolver esse problema.





Como funciona?

Como todos sabemos, groovy é uma linguagem de programação totalmente compatível com Java com compilação dinâmica . Esses dois recursos do groovy nos ajudarão a implementar avaliação de código para aplicativos Java. Você pode descobrir facilmente como adicionar suporte groovy a um projeto Java sozinho. E darei um exemplo de como implementar a avaliação de código (em certo sentido, semelhante ao que você pode ver durante a depuração em seu IDE).





1) Vamos criar uma classe bacana, e nela uma string de modelo na qual colocaremos uma classe e um espaço reservado para o código inserido dinamicamente. Um exemplo de tal linha:





def EXPRESSION_CLASS_TEMPLATE = """
package dev.toliyansky.eval.service
class ExpressionClass implements java.util.function.Supplier<Object> {
	def get() {
		%s
	}
}
"""
      
      



Observação: o pacote deve ser igual à classe na qual você escreverá este código.





Por que estamos implementando o Fornecedor será descrito abaixo.





2) Compilar e carregar dinamicamente esta classe.





REST , code .





def finalClassCode = String.format(EXPRESSION_CLASS_TEMPLATE, code)
def supplier = groovyClassLoader.parseClass(finalClassCode)
                                .getDeclaredConstructor()
                                .newInstance() as Supplier<Object>
def result = supplier.get()
      
      



%s .





, . Supplier , . Supplier<Object> .





.





code evaluation

web kubernetes. - , , , CI/CD POD , . , , - NullPointerException.





HTTP , applicationContext, . , CI/CD. . .





web spring boot

groovy java , , , , - evaluator-spring-boot-starter





, , spring boot starter. web http://host:port/eval WEB-UI, , . , . , , curl wget POD, http://host:port/eval/groovy GET POST .





, - readme .





Captura de tela do WEB-UI avaliador-spring-boot-starter
WEB-UI evaluator-spring-boot-starter

  • Demonstrou como a avaliação de código pode economizar tempo na depuração de um aplicativo





  • Demonstrou como implementar avaliação de código em um projeto java





  • Demonstrou uma solução pronta na forma de uma partida de inicialização com mola.








All Articles