Maven - Lentidão na costrução

Sou iniciante no Maven e estou aprendendo a usá-lo em um projeto que estou desenvolvendo, mas percebi que sempre que vou realizar um teste do programa demora cerca de 10 minutos só para construir o jar e executar, ele extrai todas as minhas dependências (que não são poucas) e demora uma eternidade pra executar…

Existe alguma forma de contornar isso? Se não houver eu não consigo entender a vantagem dele em ambiente de produção visto que ele cobra um preço alto pela facilidade de gerenciar bibliotecas (tempo, e muito), estou achando ele muito útil pois ele rastreia até bibliotecas que eu nem imaginava que meu projeto iria usar, mas assim não é viável.

1 curtida

Seus projetos são modulares (maven module)?

Não se usa maven em ambiente de produção, até onde sei.
O que se utiliza é o artefato gerado por ele, seja um jar executável, um war ou ear que será aplicado em um servidor e, sim, a maior vantagem é o gerenciamento das dependências e a construção deste artefato.
O @igorventurelli foi bem feliz na pergunta dele: os teus projetos são modulares? Quantos projetos são? como você montou o pom.xml?
Além disso, considere a capacidade de processamento da máquina, configuração da jvm para consumo de memória e outros detalhes que podem interferir no tempo de execução, como “onde e quando” o maven torna-se lento.

Eu estou desenvolvendo um back-end para desktop de um programa financeiro que já existe web, ou seja, o banco já existe e eu não vou implantar esse código que eu criei em um servidor.

Meu projeto não é modulado, é somente 1 projeto. Uma coisa simples CRUD mesmo, mas por ter que gerar relatórios em vários formatos, e também por usar bibliotecas externas, o maven quebrou um galhão nas dependencias. Meu POM.xml está abaixo:

Eu percebi que ele gera os artefatos e que tem um repositório local, mas toda vez que eu tento executar um teste ele extrai todas as dependencias tudo de novo,e torna o teste extremamente lento, será que existe alguma configuração no POM que faça com que ele use uma versão já extraida dos artefatos e sómente monte o Jar para realizar o teste?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>br.com.ddavel</groupId>
    <artifactId>Financeiro</artifactId>
    <version>2.0.0</version>
    <packaging>jar</packaging>

    <name>Financeiro</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mainClass>br.com.ddavel.financeiro.main.Financeiro</mainClass>
    </properties>

    <organization>
        <!-- Used as the 'Vendor' for JNLP generation -->
        <name>Diego Davel</name>
    </organization>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>unpack-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>unpack-dependencies</goal>
                        </goals>
                        <configuration>                            
                            <excludeScope>system</excludeScope>
                            <excludes>**\/*.SF,**\/*.DSA,**\/*.RSA</excludes>
                            <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
                            <outputDirectory>${project.build.directory}/classes</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <id>unpack-dependencies</id>
                        
                        <phase>package</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <executable>${java.home}/../bin/javafxpackager</executable>
                            <arguments>
                                <argument>-createjar</argument>
                                <argument>-nocss2bin</argument>
                                <argument>-appclass</argument>
                                <argument>${mainClass}</argument>
                                <argument>-srcdir</argument>
                                <argument>${project.build.directory}/classes</argument>
                                <argument>-outdir</argument>
                                <argument>${project.build.directory}</argument>
                                <argument>-outfile</argument>
                                <argument>${project.build.finalName}.jar</argument>
                            </arguments>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-cli</id>
                        <goals>
                            <goal>exec</goal>                            
                        </goals>
                        <configuration>
                            <executable>${java.home}/bin/java</executable>
                            <commandlineArgs>${runfx.args}</commandlineArgs>
                        </configuration>
                    </execution>
                </executions>  
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArgument>-Xlint:unchecked</compilerArgument>
                    <compilerArguments>
                        <bootclasspath>${sun.boot.class.path}${path.separator}${java.home}/lib/jfxrt.jar</bootclasspath>
                    </compilerArguments>
                    <showDeprecation>false</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
                <configuration>
                    <additionalClasspathElements>
                        <additionalClasspathElement>${java.home}/lib/jfxrt.jar</additionalClasspathElement>
                    </additionalClasspathElements>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-bridge</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-svggen</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>Swyno</artifactId>
            <version>1.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.derby</groupId>
                    <artifactId>derby</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.derby</groupId>
                    <artifactId>derbynet</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>10.12.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derbynet</artifactId>
            <version>10.12.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derbyclient</artifactId>
            <version>10.12.1.1</version>
        </dependency>
    </dependencies>
</project>
1 curtida

Então, o maven só faz isso (baixar dependências e montar o artefato) quando você realizar um install ou package nele.
Caso faça apenas um teste, ele deve executar com o que já tem.
Talvez seja o caso de você definir um profile no pom.xml. Dê uma pesquisada sobre isso, provavelmente te ajude.
P.S.: Vi as dependências declaradas no pom.xml e posso te garantir que ele tem pouquíssimas dependências, comparadas a um sistema com que trabalho, que tem cerca de 200 dependências definidas no pom.xml.

1 curtida

Entendi.

Cara, seu pom.xml está bem completo.
Na declaração do maven-dependency-plugin, você coloca uma tag <execution> para extrair as dependências na fase de empacotamento da sua app.
Acho que pode ser isso o que esteja atrapalhando.

Apenas para fins de testes, deixe o pom só para declarar as dependências (tag <dependencies>) e compile o projeto.
Diga se melhorou a performance.

Ele realmente deixou e de extrair as dependências, isso basicamente acabou com o problema da demora absurda que ele tinha. Agora ele cria somente o pacote de execução e eu copio esse pacote pra onde já tenho as dependências extraidas e kabum! funciona!!! um pouco trabalhoso, mas muito melhor que esperar 10 minutos de extração pra fazer um teste simples, obrigado @igorventurelli isso foi de grande ajuda.

1 curtida

Legal!!
Fico feliz por ter ajudado! :grin: