code

Maven-jar에 임의의 클래스 경로 항목을 어떻게 추가 할 수 있습니까?

codestyles 2020. 11. 28. 09:29
반응형

Maven-jar에 임의의 클래스 경로 항목을 어떻게 추가 할 수 있습니까?


실행 가능한 jar의 매니페스트에 임의의 클래스 경로 항목 (jar 파일을 가리키는)을 추가해야하는 비정상적인 상황이 있습니다. (Swing 데스크톱 애플리케이션 용입니다.)

maven-jar-plugin은 maven 종속성을 사용하여 jar 매니페스트에 대한 "Class-Path"항목을 생성하며 임의 항목을 추가하는 방법이없는 것 같습니다.

또한 "-classpath"매개 변수를 사용하여 임의의 클래스 경로 항목을 응용 프로그램을 시작하는 배치 파일에 하드 코딩하는 방법을 살펴 보았지만 Maven이 클래스 경로를 배치 파일로 필터링하도록하는 방법을 알 수 없습니다.


이 문제에 대한 쉬운 해결책이 있다는 것을 알았습니다. <Class-Path>요소에 <manifestEntries>요소를 추가하고 요소로 설정할 <addClassPath>true</addClassPath><manifest>있습니다. 따라서 <Class-Path>요소의 값은 클래스 경로에 자동으로 추가됩니다. 예:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addClasspath>true</addClasspath>
        <mainClass>your.main.Class</mainClass>
      </manifest>
      <manifestEntries>
        <Class-Path>../conf/</Class-Path>
      </manifestEntries>
    </archive>
  </configuration>
</plugin>

업데이트 : 다음은 클래스 경로를 사용자 지정 매니페스트로 필터링하는 방법입니다.

maven-dependency-plugin의 build-classpath목표는 속성 형식 (예 : classpath = [classpath])의 파일에 클래스 경로를 출력하도록 구성 할 수 있습니다. 그런 다음 생성 된 클래스 경로 파일을 사용하도록 filters 요소를 구성하고 필터링 할 리소스 디렉토리를 구성합니다.

예를 들면 :

<build>
  <plugins>
    <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.1</version>
      <executions>
        <execution>
          <phase>generate-resources</phase>
          <goals>
            <goal>build-classpath</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <outputFilterFile>true</outputFilterFile>
        <outputFile>${project.build.directory}/classpath.properties</outputFile>
      </configuration>
    </plugin>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifestFile>
            ${project.build.outputDirectory}/META-INF/MANIFEST.MF
          </manifestFile>
        </archive>
      </configuration>
    </plugin>
  </plugins>
  <filters>
    <filter>${project.build.directory}/classpath.properties</filter>
  </filters>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

그런 다음 src / main / resources / META-INF / Manifest.MF에 다음을 지정합니다.

Bundle-Version: 4.0.0
...
Classpath: ${classpath};[specify additional entries here]

Note: there is a bug with this processing using the standard window path separator (\), the generate path is stripped of separators (note it works fine on Linux). You can get the classpath to be generated correctly for Windows by specifying <fileSeparator>\\\\</fileSeparator> in the build-classpath goal's configuration.


You can customise the manifest in the jar-plugin's configuration. To do so you'd add something like this to your pom.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  ...
  <configuration>
    <archive>
      <index>true</index>
      <manifest>
        <addClasspath>true</addClasspath>
      </manifest>
      <manifestEntries>
        <mode>development</mode>
        <url>${pom.url}</url>
        <key>value</key>
      </manifestEntries>
    </archive>
  </configuration>
  ...
</plugin>

The full archiver specification provides quite a few options. See the examples page for options on configuring the classpath.

If none of these work for you, you can define your own Manifest, set up properties containing the required entries and use a filter to populate the manifest with those properties


Try to do it like they do in this bug, i.e. merge entries using manifestEntries/Class-Path element

https://issues.apache.org/jira/browse/MJAR-41

참고URL : https://stackoverflow.com/questions/1510071/maven-how-can-i-add-an-arbitrary-classpath-entry-to-a-jar

반응형