IT story

Maven : 사용자 정의 외부 JAR을 내 프로젝트에 연결하는 가장 좋은 방법은 무엇입니까?

hot-time 2020. 6. 23. 07:23
반응형

Maven : 사용자 정의 외부 JAR을 내 프로젝트에 연결하는 가장 좋은 방법은 무엇입니까?


Maven을 배우는 것은 처음 며칠이며 여전히 기본 사항으로 어려움을 겪고 있습니다. 내 프로젝트에서 참조 해야하는 외부 .jar 파일 (공개 저장소에서 사용할 수 없음)이 있으며 최선의 옵션이 무엇인지 파악하려고합니다.

라이브러리의 중앙 리포지토리가없는 소규모 프로젝트이므로 로컬 리포지토리 (어떻게 소스 제어에 추가되는지, 어떻게 작동 해야하는지 알지 못합니까) 또는 .jar을 저장해야합니다. 공식 저장소 외부의 디스크.

1) 프로젝트와 라이브러리가 모두 소스 제어에 있기를 원한다면 maven을 사용하여 .jar 파일을 프로젝트 참조에 추가하는 가장 좋은 방법은 무엇입니까?

2) 여전히 Eclipse가 종속성을 볼 수없는 것 같습니다. 나는 그것을 pom의 섹션에 수동으로 추가했으며 m2eclipse의 Dependencies 목록에 잘 나타납니다. mvn compile 및 mvn package 모두 성공하지만 프로그램을 실행하면 다음과 같은 결과가 발생합니다.

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

이것은 POM을 다음과 같이 편집 한 후입니다.

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

mvn install : install-file을 실행해야합니까? 위와 같이 이미 pom.xml을 편집했다고 생각 했습니까?

감사!


mvn install:install-file로컬 저장소를 라이브러리 jar로 채우려면 시스템에서 컴파일로 범위를 변경 해야한다고 생각합니다 .

maven으로 시작하는 경우 복잡성을 추가하기 때문에 IDE 플러그인이 아닌 maven을 직접 사용하는 것이 좋습니다.

오류에 관해서는 필요한 항아리를 클래스 경로에 넣습니까? 라이브러리에서 유형을 사용하는 경우 런타임에서도 해당 유형에 액세스해야합니다. 이것은 maven 자체와 관련이 없습니다.

라이브러리를 소스 제어에 배치하려는 이유를 이해하지 못합니다. 바이너리 항아리가 아닌 소스 코드 용입니다.


In Project Repository를 만들 수 있으므로 run mvn install:install-file새 컴퓨터에서 작업 때마다 필요하지는 않습니다.

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

세부 사항이 블로그 포스트를 읽으십시오

http://charlie.cu.cc/2012/06/how-add-external-libraries-maven/


<dependency> 요소 안에 중첩 된 <scope> 요소를 사용하면 쉽게 달성 할 수 있습니다.

예를 들면 다음과 같습니다.

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

참조 : http://www.tutorialspoint.com/maven/maven_external_dependencies.htm


Maven 매뉴얼 은 다음과 같이 말합니다 .

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

업데이트 이후 Google은 자체 Nexus 서버를 훨씬 쉽고 깔끔하게 설치했습니다.

우리 회사에는 항아리가 있었지만 공통적이지 만 어떤 maven 저장소에 호스팅되지 않았거나 로컬 저장소에 보관하지 않으려는 항아리도있었습니다. 우리는 Github에서에 매우 간단한 MVN (공공)의 repo를 만들어 (하지만 당신은 로컬 서버 나에 호스팅 할 수 있습니다) :
참고 이 몇 거의 chaning하지 jar 파일을 관리하기위한 유일한 이상적인지를

  1. GitHub에서 저장소를 만듭니다.
    https://github.com/<user_name>/mvn-repo/

  2. pom.xml에 리포지토리 추가
    (전체 경로 원시 파일은 리포지토리 이름과 약간 다름)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
    
  3. 호스트 (Github 또는 개인 서버)에
    대한 종속성 추가 여러분이 알아야 할 것은 파일이 @glitch
    /groupId/artifactId/version/artifactId-version.jar
    b에 언급 된 패턴으로 저장된다는 것 입니다. 호스트에서이 패턴과 일치하는 폴더를 만듭니다.
    service-sdk-0.0.1.jar, 이름의 jar 파일이있는 경우 폴더를 작성 service-sdk/service-sdk/0.0.1/하고 jar 파일 service-sdk-0.0.1.jar폴더 에 넣으 십시오.
    씨. 브라우저에서 jar 파일을 다운로드하여 테스트하십시오 (이 경우 :https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. pom.xml 파일에 대한 종속성을 추가하십시오 :

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
    
  5. 즐겨


systemPath를 사용하지 마십시오. 사람들이 여기에서 말한 것과 달리 체크 아웃 된 프로젝트 디렉토리 아래의 폴더에 외부 병을 넣고 Maven이 다른 종속성처럼 찾도록 할 수 있습니다. 다음은 두 가지 중요한 단계입니다.

  1. -DlocalRepositoryPath와 함께 "mvn install : install-file"을 사용하십시오.
  2. POM에서 해당 경로를 가리 키도록 저장소를 구성하십시오.

매우 간단하며 단계별 예제를 찾을 수 있습니다. http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


Maven 프로젝트에 Maven 이외의 항아리를 추가하는 Maven 방법

메이븐 프로젝트 및 메이븐이 아닌 항아리

빌드 섹션에 maven 설치 플러그인 추가

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

의존성 추가

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

참고 사항 블로그의 소유자입니다


동일한 문제가 발생하고 spring-boot v1.4 +를 사용 하는 경우 이러한 방식으로 해결할 수 있습니다.

jar에 시스템 범위 종속성을 추가하는 데 사용할 수 있는 includeSystemScope 가 있습니다.

예 :

내 프로젝트에 Oracle 드라이버를 사용하고 있습니다.

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

jar를 경로 / BOOT-INF / lib / **에 포함 시키려면 includeSystemScope = true로 설정하십시오

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

중복 포함을 피하기 위해 자원에서 제외하고 항아리는 충분히 뚱뚱합니다 ~

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

Good luck!


Change your systemPath.

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

The pom.xml is going to look at your local repository to try and find the dependency that matches your artifact. Also you shouldn't really be using the system scope or systemPath attributes, these are normally reserved for things that are in the JDK and not the JRE

See this question for how to install maven artifacts.


Note that all of the example that use

<repository>...</respository> 

require outer

<repositories>...</repositories> 

enclosing tags. It's not clear from some of the examples.


The best solution here is to install a repository: Nexus or Artifactory. If gives you a place to put things like this, and further it speeds things up by caching your stuff from the outside.

If the thing you are dealing with is open source, you might also consider putting in into central.

See the guide.


With Eclipse Oxygen you can do the below things:

  1. Place your libraries in WEB-INF/lib
  2. Project -> Configure Build Path -> Add Library -> Web App Library

Maven will take them when installing the project.


If the external jar is created by a Maven project only then you can copy the entire project on your system and run a

mvn install

in the project directory. This will add the jar into .m2 directory which is local maven repository.

Now you can add the

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

This will ensure that you

mvn exec:java 

works. If you use suggested here

<scope>system</scope>

Then you will have to add classes individually while using executing through command line.

You can add the external jars by the following command described here

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

참고URL : https://stackoverflow.com/questions/5692256/maven-best-way-of-linking-custom-external-jar-to-my-project

반응형