예를 들어

import java.util.Date;

public class person {
    Date birthDt;
    int age;
    String name;
    String address_country;
    String address_city;
    String address_detail;
    String hobby;
    char gender;
    double weight;
    double height;

    public Date getBirthDt() {
        return birthDt;
    }

    public void setBirthDt(Date birthDt) {
        this.birthDt = birthDt;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress_country() {
        return address_country;
    }

    public void setAddress_country(String address_country) {
        this.address_country = address_country;
    }

    public String getAddress_city() {
        return address_city;
    }

    public void setAddress_city(String address_city) {
        this.address_city = address_city;
    }

    public String getAddress_detail() {
        return address_detail;
    }

    public void setAddress_detail(String address_detail) {
        this.address_detail = address_detail;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }
}

person class가 있고, 

import java.util.Comparator;

public class PeopleCompareUtil implements Comparator<Object> {
    /**
     * Compares its two arguments for order.  Returns a negative integer,
     * zero, or a positive integer as the first argument is less than, equal
     * to, or greater than the second.<p>
     * <p>
     * The implementor must ensure that {@link Integer#signum
     * signum}{@code (compare(x, y)) == -signum(compare(y, x))} for
     * all {@code x} and {@code y}.  (This implies that {@code
     * compare(x, y)} must throw an exception if and only if {@code
     * compare(y, x)} throws an exception.)<p>
     * <p>
     * The implementor must also ensure that the relation is transitive:
     * {@code ((compare(x, y)>0) && (compare(y, z)>0))} implies
     * {@code compare(x, z)>0}.<p>
     * <p>
     * Finally, the implementor must ensure that {@code compare(x,
     * y)==0} implies that {@code signum(compare(x,
     * z))==signum(compare(y, z))} for all {@code z}.
     *
     * @param o1 the first object to be compared.
     * @param o2 the second object to be compared.
     * @return a negative integer, zero, or a positive integer as the
     * first argument is less than, equal to, or greater than the
     * second.
     * @throws NullPointerException if an argument is null and this
     *                              comparator does not permit null arguments
     * @throws ClassCastException   if the arguments' types prevent them from
     *                              being compared by this comparator.
     * @apiNote It is generally the case, but <i>not</i> strictly required that
     * {@code (compare(x, y)==0) == (x.equals(y))}.  Generally speaking,
     * any comparator that violates this condition should clearly indicate
     * this fact.  The recommended language is "Note: this comparator
     * imposes orderings that are inconsistent with equals."
     */
    @Override
    public int compare(Object o1, Object o2) {
        Person obj1 = (Person)o1;
        Person obj2 = (Person)o2;
        int result = 0;
        if(obj1.getAge() > obj2.getAge()) {
            result = 1;
        } else {
            result = -1;
        }
        if(obj1.getAge() == obj2.getAge()) {
            if(obj1.getHeight() > obj2.getHeight()){
                result = 1;
            }
        }
        return result;
    }
}

이런 경우에

 

height 가 같은 경우에는 다루고 있지 않아서 에러를 내는 줄 알았는데..

 

Person에 age와 height 만 빼서 돌린 경우에는 에러안난다..

뭘까 . 항상 에러가 나는건 아닌 건가..

 

https://www.geeksforgeeks.org/timsort/ 

 

TimSort - Data Structures and Algorithms Tutorials - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

Comparator의 compare을 overriding 했을 때 위의 주석에 쓰여져 있는 부분을 보면 설명이 있음..

     * The implementor must ensure that {@link Integer#signum
     * signum}{@code (compare(x, y)) == -signum(compare(y, x))} for
     * all {@code x} and {@code y}.  (This implies that {@code
     * compare(x, y)} must throw an exception if and only if {@code
     * compare(y, x)} throws an exception.)<p>
     * <p>
     * The implementor must also ensure that the relation is transitive:
     * {@code ((compare(x, y)>0) && (compare(y, z)>0))} implies
     * {@code compare(x, z)>0}.<p>
     * <p>
     * Finally, the implementor must ensure that {@code compare(x,
     * y)==0} implies that {@code signum(compare(x,
     * z))==signum(compare(y, z))} for all {@code z}.

인터페이스를 구현한 클래스에서는 compare(x, y) 가 -1 이면 compare(y, z) 가 1 이어야 된다. -> 대칭성

인터페이스를 구현한 클래스에서는 추이성을 보장해야 한다. (transitivity) -> 추이성

인터페이스를 구현한 클래스에서는 compare(x, y) ==0 이면 compare(x, z) == compare(y, z) 어야 한다.  

 

 

TimSort의 정렬 알고리즘을 사용할 때 중요한 것

1. 반사성 : a와 a를비교할 때 항상 같아야 한다. ( a == a )

2. 대칭성: a > b 라면 b < a 가 되어야 한다.

3. 추이성: a < b 이고 b < c 이면 a < c 여야 한다.

4. 일관성 : 두 객체 a와 b가 같다면, 다른 비교가 반복되어도 계속 같아야 한다. 즉, compare(a,b)가 0 이라면 a와 b가 변하지 않는 한 compare(a,b)가 항상 0이어야 한다.

 

비교 연산에서 중요한 성질로 네 가지를 모두 만족해야 Comparator가 안전하고 일관되게 사용될 수 있다.

--> 위배되면 어쩔때는 정렬되고 어쩔때는 안되는 상황이 발생할 수 있다.

 

 

내가 정렬에 에러를 마주쳤을 때 아래 메소드를 통해서 정렬한 경우에는 정렬이 잘 되었었다. 

Comparator<Person> comparator = Comparator
    .comparing(Person::getAge)
    .thenComparing(Person::getHeight);

 

가독성도 좋은 듯. 

Comparator class를 따로 구현했을 때는 들어가봐야하는데..

 

정렬할 때 기준을 정한다면 같은 경우, 작은경우, 큰경우 를 잘 숙고 해야 함.

 

유의하자. 

 

https://www.baeldung.com/java-8-comparator-comparing

'정보 > Language' 카테고리의 다른 글

[Javascript] Object, Array  (0) 2024.01.09
Kotlin: Functions  (0) 2023.08.02
Kotlin: Control Flow  (0) 2023.07.31
Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26

Jenkins User Handbook을 보다가 해당 챕터를 보고 의문이 생김.

https://www.jenkins.io/doc/book/using/best-practices/#dont-use-the-maven-job-type 

https://plugins.jenkins.io/maven-plugin/#plugin-content-risks

 

Maven Integration

This plugin provides a deep integration between Jenkins and Maven. It adds support for automatic triggers between projects depending on SNAPSHOTs as well as the automated configuration of various Jenkins publishers such as Junit.

plugins.jenkins.io

더보기

Jenkins 프로젝트는 사용자들이 Maven 작업 유형에서 Pipeline 작업 또는 프리스타일 작업으로 전환할 것을 권장합니다. 이는 2013년 Stephen Connolly의 블로그 게시물 "Jenkins' Maven job type considered evil"에서 설명된 여러 이유 때문입니다.

Jenkins에서 Maven 프로젝트를 빌드하는 방법은 여러 가지가 있습니다:

  1. Maven 빌드 단계를 사용한 프리스타일 프로젝트
  2. Maven 스타일 프로젝트
  3. 쉘, 배치, 또는 파워쉘 빌드 단계를 사용한 Pipeline 프로젝트

첫 번째 방법은 Maven이 의도한 대로 빌드를 실행하며, 사용자가 직접 설정해야 합니다. 두 번째 방법은 여러 훅을 추가하고 자동으로 설정을 추측하려 합니다. 두 번째 방법은 초기 설정이 더 사용자 친화적이지만, 문제가 발생하면 디버깅이 어렵습니다. 첫 번째 방법은 문제가 발생하면 정확히 재현할 수 있어 디버깅이 용이합니다. 두 번째 방법은 문제가 발생하면 재현이 어렵습니다.

두 번째 방법은 설정이 쉬워 매력적이지만, 큰 문제를 야기할 수 있습니다.

 

maven job type의 issue 

https://issues.jenkins.io/browse/JENKINS-19095 

또 test 가 failure 이어도 무시한다는 점.

 

따라서, maven job type을 사용하지 말라고 하고 있다. 

'정보 > Server' 카테고리의 다른 글

Jenkins ssh-agent provider 관련 error  (0) 2024.07.25
Java vm option [argument] 확인하기  (0) 2024.05.23
[Project] maven setting.xml  (0) 2024.04.26
[Project] The settings.xml File in Maven  (1) 2024.04.26
[Project] Maven Packaging Types  (0) 2024.04.26

[ssh-agent] FATAL: Could not find a suitable ssh-agent provider

 

 

where ssh-agent 를 쳐서 ssh-agent 가 어디에 있는지 확인.

시스템 환경 변수 PATH 확인 시

C:\windows\System32\OpenSSH\ssh-agent.exe 

가 등록되어 있었으나.

C:\Program Files\Git\usr\bin\ssh-agent.exe 를 사용하도록 등록하고, 제일 위로 올려서 해결

 

https://stackoverflow.com/questions/61718761/ssh-agent-not-working-on-jenkins-pipeline

 

ssh-agent not working on jenkins pipeline

I am newbie and trying to implement CI/CD for my hello world reactive spring project. After releasing the image to docker repo, the next step is to connect to aws ec2 and run the created image. I h...

stackoverflow.com

 

실행 중인 서버의 vm option을 확인하기 위해서는 

jps 명령어를 사용하여 알 수 있다. 

 

https://www.ibm.com/docs/en/semeru-runtime-ce-z/11?topic=tools-java-process-status-jps

 

Java process status (jps)

<!-- * Copyright (c) 2017, 2024 IBM Corp. and others * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution and is available at * https://www.eclipse.org/

www.ibm.com

 

jps -v

해당 옵션을 사용하면 vm에 전달된 option들을 확인할 수 있다. 

필자는 home directory 에 .bash_profile에 alias를 설정해 놓은 것들이 있다.

예를 들어 아래와 같이 설정해두었기 때문에 해당 alias를 종종 사용하는 편인데,

 

IntelliJ Terminal에서는 사용이 불가능 했다. 

alias opendir='explorer .'
alias gorepo='cd "C:\DEV"'

 

해결 방법 

1. File > Settings > Tools > Terminal 에 shell path에 --login 옵션을 추가한다.
2. File > Settings > Tools > Terminal 에 shell path에 --rcfile ~/.bash_profile 옵션을 추가한다.

 

https://intellij-support.jetbrains.com/hc/en-us/community/posts/205437150-Terminal-not-sourcing-bash-profile?page=1#community_comment_204862230

나와 같은 현상을 겪던 유저가 올려놓은 것인데, (해당 유저는 Pycharm을 사용함)

comment에서 --rcfile ~/.bash_profile 로 하면 된다는 것도 추가로 알 수 있었음.

 

보통 터미널을 열면 interactive 모드로 열리는데, interactive 모드는 

 

사용자가 터미널(또는 콘솔)에서 실시간으로 명령어를 입력하고 그 결과를 즉시 확인할 수 있는 모드입니다.

 

 

근데 intelliJ에서는 non-interactive 모드로 열려서 .bash_profile은 읽지 않고 있었다. 

 

https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html

 

Bash Startup Files (Bash Reference Manual)

6.2 Bash Startup Files This section describes how Bash executes its startup files. If any of the files exist but cannot be read, Bash reports an error. Tildes are expanded in filenames as described above under Tilde Expansion (see Tilde Expansion). Interac

www.gnu.org

위의 글을 확인해보면 non-interactive mode에서는 .bashrc 만 읽는다고 한다.

 

따라서 --login 옵션을 주어 나의 custom setting이 들어가져 있는 .bash_profile이 적용되도록 하면 된다.

 

setting.xml 설정 관련 https://www.baeldung.com/maven-settings-xml#bd-configurations 를 번역해 올리긴 했는데.

필자는

<localRepository>C:\dev\...</localRepository>

이런식으로 <localRepository> 만 사용 해봄. 

profile 도 pom.xml 에서 사용.

 

profile의 경우 dev와 product (운영)간 따로 패키징할때 사용...

 

 

 

참고용

https://github.com/apache/maven-war-plugin/tree/4f8a41ec48333bb6d4eddfa4bd06ecd7d529807a

 

GitHub - apache/maven-war-plugin: Apache Maven WAR Plugin

Apache Maven WAR Plugin. Contribute to apache/maven-war-plugin development by creating an account on GitHub.

github.com

 

https://www.baeldung.com/maven-settings-xml 구글번역 + 자체교정

 

 

1. 개요

Maven을 사용하는 동안 우리는 대부분의 프로젝트별 구성을 pom.xml에 유지합니다.
Maven은 사용할 로컬 및 원격 저장소를 지정할 수 있는 설정 파일인 settings.xml을 제공합니다. 자격 증명( credentials )과 같이 소스 코드에 원하지 않는 설정을 저장하는 데에도 사용할 수 있습니다.
이 튜토리얼에서는 settings.xml을 사용하는 방법을 배웁니다. 프록시, 미러링, 프로필을 살펴보겠습니다. 또한 프로젝트에 적용되는 현재 설정을 결정하는 방법에 대해서도 논의하겠습니다.

 

2. 구성

settings.xml 파일은 Maven 설치를 구성합니다. pom.xml 파일과 유사하지만 전역적으로 또는 사용자별로 정의됩니다.
settings.xml 파일에서 구성할 수 있는 요소를 살펴보겠습니다. settings.xml 파일의 기본 설정 요소에는 사전 정의된 9개의 하위 요소가 포함될 수 있습니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository/>
    <interactiveMode/>
    <offline/>
    <pluginGroups/>
    <servers/>
    <mirrors/>
    <proxies/>
    <profiles/>
    <activeProfiles/>
</settings>

 

2.1. Simple Values

일부 최상위 구성 요소에는 간단한 값이 포함되어 있습니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository>${user.home}/.m2/repository</localRepository>
    <interactiveMode>true</interactiveMode>
    <offline>false</offline>
</settings>

localRepository 요소는 시스템의 로컬 저장소 경로를 가리킵니다. 로컬 저장소는 프로젝트의 모든 종속성이 캐시되는 곳입니다. 기본값은 사용자의 홈 디렉터리를 사용하는 것입니다. 그러나 로그인한 모든 사용자가 공통 로컬 저장소에서 빌드할 수 있도록 이를 변경할 수 있습니다.
InteractiveMode 플래그는 Maven이 입력을 요청하는 사용자와 상호 작용할 수 있는지 여부를 정의합니다. 이 플래그의 기본값은 true입니다.
오프라인 플래그는 빌드 시스템이 오프라인 모드에서 작동할 수 있는지 여부를 결정합니다. 기본값은 false입니다. 그러나 빌드 서버가 원격 저장소에 연결할 수 없는 경우에는 이를 true로 전환할 수 있습니다.

 

2.2. Plugin Groups

PluginGroups 요소에는 groupId를 지정하는 하위 요소 목록이 포함되어 있습니다. groupId는 특정 Maven 아티팩트를 생성한 조직의 고유 식별자입니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <pluginGroups>
        <pluginGroup>org.apache.tomcat.maven</pluginGroup>
    </pluginGroups>
</settings>

Maven은 명령줄에 제공된 groupId 없이 플러그인을 사용할 때 플러그인 그룹 목록을 검색합니다. 목록에는 기본적으로 org.apache.maven.plugins 및 org.codehaus.mojo 그룹이 포함되어 있습니다. 위에 정의된 settings.xml 파일을 사용하면 잘린 Tomcat 플러그인 명령을 실행할 수 있습니다. (잘린 tomcat 플러그인을 실행할 수 있다는 거는 밑에 명령어를 말하는 듯하다.)

mvn tomcat7:help
mvn tomcat7:deploy
mvn tomcat7:run

 

2.3. 프록시

Maven의 HTTP 요청 중 일부 또는 전부에 대해 프록시를 구성할 수 있습니다. 프록시 요소는 하위 프록시 요소 목록을 허용하지만 한 번에 하나의 프록시만 활성화할 수 있습니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <proxies>
        <proxy>
            <id>baeldung-proxy</id>
            <active>true</active>
            <protocol>http</protocol>
            <host>baeldung.proxy.com</host>
            <port>8080</port>
            <username>demo-user</username>
            <password>dummy-password</password>
            <nonProxyHosts>*.baeldung.com|*.apache.org</nonProxyHosts>
        </proxy>
    </proxies>
</settings>

활성 플래그를 통해 현재 활성 프록시를 정의합니다. 그런 다음 nonProxyHosts 요소를 사용하여 프록시되지 않는 호스트를 지정합니다. 사용되는 구분 기호는 특정 프록시 서버에 따라 다릅니다. 가장 일반적인 구분 기호는 파이프(|)와 쉼표(,)입니다.

 

2.4. Mirrors

저장소는 pom.xml 프로젝트 내에서 선언될 수 있습니다. 이는 프로젝트 코드를 공유하는 개발자가 즉시 올바른 저장소 설정을 얻을 수 있음을 의미합니다.

특정 저장소에 대한 대체 미러를 정의하려는 경우 미러를 사용할 수 있습니다. 이는 pom.xml의 내용을 재정의합니다.
예를 들어, 모든 저장소 요청을 미러링하여 Maven이 단일 저장소를 사용하도록 강제할 수 있습니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <mirror>
            <id>internal-baeldung-repository</id>
            <name>Baeldung Internal Repo</name>
            <url>https://baeldung.com/repo/maven2/</url>
            <mirrorOf>*</mirrorOf>
        </mirror>
    </mirrors>
</settings>


주어진 저장소에 대해 하나의 미러만 정의할 수 있으며 Maven은 첫 번째 일치 항목을 선택합니다. 일반적으로 CDN을 통해 전 세계적으로 배포되는 공식 저장소를 사용해야 합니다.

 

2.5. 서버

pom.xml 프로젝트에서 저장소를 정의하는 것은 좋은 습관입니다. 그러나 자격 증명( credentials )과 같은 보안 설정을 pom.xml을 사용하여 소스 코드 저장소에 넣어서는 안 됩니다. 대신 settings.xml 파일에 이 보안 정보를 정의합니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>
            <id>internal-baeldung-repository</id>
            <username>demo-user</username>
            <password>dummy-password</password>
            <privateKey>${user.home}/.ssh/bael_key</privateKey>
            <passphrase>dummy-passphrase</passphrase>
            <filePermissions>664</filePermissions>
            <directoryPermissions>775</directoryPermissions>
            <configuration></configuration>
        </server>
    </servers>
</settings>

settings.xml의 서버 ID는 pom.xml에 언급된 저장소의 ID 요소와 일치해야 합니다. XML을 사용하면 placeholders 를 사용하여 환경 변수에서 자격 증명 ( credentials )을 선택할 수도 있습니다.

 

3. profile

profile 요소를 사용하면 ID 하위 요소로 구별되는 여러 프로필 하위 요소를 만들 수 있습니다. settings.xml의 profile 요소는 pom.xml에서 사용할 수 있는 동일한 요소의 잘린 버전입니다.
activationrepositoriespluginRepositories, and properties 의 네 가지 하위 요소만 포함할 수 있습니다. 이러한 요소는 특정 프로젝트 대신 빌드 시스템 전체를 구성합니다.
settings.xml의 활성 프로필 값이 pom.xml 또는 profile .xml 파일의 어떤 동등한 해당 profile 값보다 우선 적용된다는 점에 유의하는 것이 중요합니다. 프로필은 ID와 일치합니다.

 

3.1. Activation

특정 상황에서만 특정 값을 수정하기 위해 프로필을 사용할 수 있습니다. activation 요소를 사용하여 이러한 상황을 지정할 수 있습니다. 결과적으로 지정된 모든 기준이 충족되면 profile activation이 발생합니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <profiles>
        <profile>
            <id>baeldung-test</id>
            <activation>
                <activeByDefault>false</activeByDefault>
                <jdk>1.8</jdk>
                <os>
                    <name>Windows 10</name>
                    <family>Windows</family>
                    <arch>amd64</arch>
                    <version>10.0</version>
                </os>
                <property>
                    <name>mavenVersion</name>
                    <value>3.0.7</value>
                </property>
                <file>
                    <exists>${basedir}/activation-file.properties</exists>
                    <missing>${basedir}/deactivation-file.properties</missing>
                </file>
            </activation>
        </profile>
    </profiles>
</settings>

네 가지 가능한 activators 가 있으며 모두 지정할 필요는 없습니다.

  • jdk: 지정된 JDK 버전에 따라 활성화됩니다(범위가 지원됨).
  • os: 운영 체제 속성에 따라 활성화됩니다.
  • property : Maven이 특정 속성 값을 감지하면 프로필을 활성화합니다.
  • file: 주어진 파일 이름이 존재하거나 누락된 경우 프로필을 활성화합니다.

어떤 프로필이 특정 빌드를 활성화할지 확인하려면 Maven 도움말 플러그인을 사용할 수 있습니다.

mvn help:active-profiles

출력에는 특정 프로젝트에 대해 현재 활성화된 프로필이 표시됩니다.

[INFO] --- maven-help-plugin:3.2.0:active-profiles (default-cli) @ core-java-streams-3 ---
[INFO]
Active Profiles for Project 'com.baeldung.core-java-modules:core-java-streams-3:jar:0.1.0-SNAPSHOT':
The following profiles are active:
 - baeldung-test (source: com.baeldung.core-java-modules:core-java-streams-3:0.1.0-SNAPSHOT)

 

3.2. Properties

Maven 속성은 특정 값에 대한 명명된 placeholders 로 생각할 수 있습니다. ${property_name} 표기법을 사용하여 pom.xml 파일 내에서 값에 액세스할 수 있습니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <profiles>
        <profile>
            <id>baeldung-test</id>
            <properties>
                <user.project.folder>${user.home}/baeldung-tutorials</user.project.folder>
            </properties>
        </profile>
    </profiles>
</settings>

pom.xml 파일에서는 네 가지 유형의 속성을 사용할 수 있습니다.

  • env 접두사를 사용하는 속성은 ${env.PATH}와 같은 환경 변수 값을 반환합니다.
  • 프로젝트 접두사를 사용하는 속성은 ${project.version}과 같은 pom.xml의 프로젝트 요소에 설정된 속성 값을 반환합니다.
  • setting 접두사를 사용하는 속성은 ${settings.localRepository}와 같은 settings.xml에서 해당 요소의 값을 반환합니다.
  • ${java.home}과 같이 Java의 System.getProperties 메소드를 통해 사용 가능한 모든 속성을 직접 참조할 수 있습니다.
  • ${junit.version}과 같이 접두사가 없는 속성 요소 내에 설정된 속성을 사용할 수 있습니다.

3.3. Repositories

원격 저장소에는 Maven이 로컬 저장소를 채우는 데 사용하는 아티팩트 모음이 포함되어 있습니다. 특정 아티팩트에는 다른 원격 저장소가 필요할 수 있습니다. Maven은 활성 프로필에서 활성화된 저장소를 검색합니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <profiles>
        <profile>
            <id>adobe-public</id>
            <repositories>
	        <repository>
	            <id>adobe-public-releases</id>
	            <name>Adobe Public Repository</name>
	            <url>https://repo.adobe.com/nexus/content/groups/public</url>
	            <releases>
	                <enabled>true</enabled>
	                <updatePolicy>never</updatePolicy>
	            </releases>
	            <snapshots>
	                <enabled>false</enabled>
	            </snapshots>
	        </repository>
	    </repositories>
        </profile>
    </profiles>
</settings>

repository 요소를 사용하여 특정 저장소의 아티팩트 릴리스 또는 스냅샷 버전만 활성화할 수 있습니다.

 

3.4. Plugin Repositories

Maven 아티팩트에는 종속성 및 플러그인이라는 두 가지 표준 유형이 있습니다. Maven 플러그인은 특별한 유형의 아티팩트이므로 플러그인 저장소를 다른 저장소와 분리할 수 있습니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <profiles>
        <profile>
            <id>adobe-public</id>
            <pluginRepositories>
               <pluginRepository>
                  <id>adobe-public-releases</id>
                  <name>Adobe Public Repository</name>
                  <url>https://repo.adobe.com/nexus/content/groups/public</url>
                  <releases>
                      <enabled>true</enabled>
                      <updatePolicy>never</updatePolicy>
                  </releases>
                  <snapshots>
                      <enabled>false</enabled>
                  </snapshots>
	        </pluginRepository>
	    </pluginRepositories>
        </profile>
    </profiles>
</settings>

pluginRepositories 요소의 구조는 repositories 요소와 매우 유사합니다. (위의 코드블럭 repositories element와 구조가 유사)

 

3.5. Active Profiles

activeProfiles 요소에는 특정 프로필 ID를 참조하는 하위 요소가 포함되어 있습니다. Maven은 여기에 참조된 모든 프로필을 자동으로 활성화합니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <activeProfiles>
        <activeProfile>baeldung-test</activeProfile>
        <activeProfile>adobe-public</activeProfile>
    </activeProfiles>
</settings>

 

이 예에서 mvn의 모든 호출은 명령줄에 -P baeldung-test,adobe-public을 추가한 것처럼 실행됩니다.

 

4. Settings Level

settings.xml 파일은 일반적으로 다음 두 위치에서 찾을 수 있습니다. 

  • Mavens 홈 디렉터리의 전역 설정: ${maven.home}/conf/settings.xml
  • 사용자 설정: ${user.home}/.m2/settings.xml

두 파일이 모두 존재하면 해당 내용이 병합됩니다. 사용자 설정의 구성이 우선적으로 적용됩니다.

 

4.1. Determine File Location

전역 및 사용자 설정의 위치를 ​​결정하기 위해 디버그 플래그를 사용하여 Maven을 실행하고 출력에서 ​​"설정"을 검색할 수 있습니다.

mvn -X clean | grep "settings"

[DEBUG] Reading global settings from C:\Program Files (x86)\Apache\apache-maven-3.6.3\bin\..\conf\settings.xml
[DEBUG] Reading user settings from C:\Users\Baeldung\.m2\settings.xml

 

4.2. Determine Effective Settings

Maven 도움말 플러그인을 사용하여 결합된 전역 및 사용자 설정의 내용을 확인할 수 있습니다.

mvn help:effective-settings

다음은 XML 형식의 설정을 설명합니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <localRepository>C:\Users\Baeldung\.m2\repository</localRepository>
    <pluginGroups>
        <pluginGroup>org.apache.tomcat.maven</pluginGroup>
        <pluginGroup>org.apache.maven.plugins</pluginGroup>
        <pluginGroup>org.codehaus.mojo</pluginGroup>
    </pluginGroups>
</settings>

 

4.3. Override the Default Location

Maven을 사용하면 명령줄을 통해 전역 및 사용자 설정의 위치를 ​​재정의할 수도 있습니다.

mvn clean --settings c:\user\user-settings.xml --global-settings c:\user\global-settings.xml
// --setting 과 -s 가 같은 옵션
mvn clean --s c:\user\user-settings.xml --gs c:\user\global-settings.xml

 

5. Conclusion

이 기사에서는 Maven의 settings.xml 파일에서 사용할 수 있는 구성을 살펴보았습니다. 프록시, 리포지토리 및 프로필을 구성하는 방법을 배웠습니다. 다음으로 전역 설정 파일과 사용자 설정 파일의 차이점과 사용 중인 파일을 확인하는 방법을 살펴보았습니다. 마지막으로 사용되는 효과적인 설정을 결정하고 기본 파일 위치를 재정의하는 방법을 살펴보았습니다.

'정보 > Server' 카테고리의 다른 글

Java vm option [argument] 확인하기  (0) 2024.05.23
[Project] maven setting.xml  (0) 2024.04.26
[Project] Maven Packaging Types  (0) 2024.04.26
[Project] Accessing Maven Properties in Java  (0) 2024.04.25
[Project] Maven Properties Defaults  (1) 2024.04.25

+ Recent posts