Pergunta

Estou construindo uma ferramenta de linha de comando que depende de alguns arquivos de configuração.

No desenvolvimento, coloquei esses arquivos em src/main/resources, e acessado por getClass().getResourceAsStream("/config-file-name"), o que funciona bem.

Eu escolho maven-assembly-plugin para construir o jar com todas as dependências.

    <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.myproject.Scheduler</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
               <execution>
                   <id>make-my-jar-with-dependencies</id>
                   <phase>package</phase>
                   <goals>
                       <goal>single</goal>
                   </goals>
               </execution>
            </executions>
    </plugin>       

Os arquivos de configuração estão todos embrulhados em jar, mas quero separá-los.

Então, adiciono a seguinte configuração,

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>conf.properties</include>
            </includes>
            <filtering>true</filtering>
            <excludes>
                <exclude></exclude>
            </excludes>
        <targetPath>..</targetPath>             
        </resource>
    </resources>

Depois de fazer isso, os arquivos de configuração ficam ao lado do jar em vez de serem agrupados no jar.

Mas meu código não pode acessar os arquivos agora.

Preciso mudar minha forma de acessar os arquivos no código?

Ou devo não colocar esses arquivos em src/main/resources/, alguma alternativa?

Se alguém souber, por favor ajude.

Obrigado.


Atualizar:Por fim, desisto de usar o arquivo de recursos maven; em vez disso, defino o caminho do arquivo para o mesmo caminho do jar por padrão, tudo funciona bem, exceto a reclamação do Eclipse.

Como quero mover o arquivo de configuração para fora do jar e não quero que ele fique na pasta target/classes, então uso <targetPath>..</targetPath> para mover o arquivo de configuração para o mesmo diretório do arquivo jar.

Quando eu gero novamente as configurações do projeto Eclipse, o Eclipse diz:Não é possível aninhar a pasta de saída "projeto/destino/classes de teste" dentro da pasta de saída "projeto/destino".

Alguém me ajuda?

Foi útil?

Solução 3

Finalmente desisto de usar o arquivo de recursos maven, defino o caminho do arquivo para o mesmo caminho do jar por padrão, tudo funciona bem, exceto a reclamação do Eclipse.

(Como quero mover o arquivo de configuração para fora do jar e não quero que ele fique na pasta target/classes, então uso ..para mover o arquivo de configuração para o mesmo diretório do arquivo jar.Quando eu gero novamente as configurações do projeto Eclipse, o Eclipse diz:Não é possível aninhar a pasta de saída "project/target/test-classes" dentro da pasta de saída "project/target".)

Não encontrei solução até agora, parece um bug do Eclipse.

Agora, desisti do Eclipse e mudei para o IntelliJ IDEA, é um IDE muito bom, especialmente perfeitamente integrado ao Maven.Evitarei qualquer chance de usar o Eclipse para qualquer projeto maven.

Outras dicas

Seu aplicativo não pode acessar os arquivos de configuração porque não está mais em seu classpath.

Se você quiser separar seus arquivos de configuração do resto do aplicativo, você pode querer dar uma nova olhada em seu formato de montagem.Você pode querer usar bin em vez de jar-com-dependências, embora isso apresente desafios de distribuição e uso.

Dependendo de quão complicado é o arquivo de propriedades, você pode usar a capacidade de filtro do plug-in de recursos para alterar o valor com base em perfis maven.Por exemplo, se você quiser ter uma propriedade chamada location, poderá definir um perfil de desenvolvimento e produção e, em seguida, definir o valor como uma propriedade maven no pom (ou profiles.xml se estiver no maven 2):

<properties>
  <my.location>the_real_value</my.location>
</properties>

Então, no arquivo de propriedades, você faria isso:

location=${my.location}

Apenas certifique-se de ativar a filtragem em seu pom, assim:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

Ao construir, se você olhar no diretório de destino e visualizar esse arquivo de propriedades, deverá ver o valor correto substituído.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top