Làm cách nào để đưa phiên bản dự án Maven vào dòng lệnh bash


201

Trước đây tôi đã đưa ra một câu hỏi về cách thay đổi vesion dự án Maven từ dòng lệnh dẫn tôi đến một vấn đề mới.

Trước đây tôi có thể lấy số phiên bản vì phiên bản được lưu trữ dưới dạng một thuộc tính dễ grep và phân tích từ dòng lệnh (bash). Bây giờ phần tử pom.xml được sử dụng cho việc này, nó không còn là duy nhất vì tất cả các phụ thuộc và có thể một số người khác cũng sử dụng phần tử này. Tôi nghĩ rằng không có cách nào để có được số phiên bản hiện tại với tập lệnh bash mà không có các công cụ bên ngoài để phân tích cú pháp xml hoặc một số lệnh sed nhận biết ngữ cảnh.

Giải pháp sạch nhất trong ý kiến ​​của tôi sẽ là Maven cung cấp thông tin phiên bản này. Tôi đã nghĩ đến việc viết một plugin maven tùy chỉnh để lấy các thuộc tính khác nhau nhưng tôi nghĩ tôi sẽ hỏi ở đây trước.

Vì vậy, có cách nào dễ dàng để có được giá trị của ${project.version}dòng lệnh không? Cảm ơn trước.

Giải pháp

Cảm ơn bạn vì sự giúp đỡ. Tôi đã phải cdvào thư mục bằng tay nhưng điều đó có thể được thực hiện dễ dàng. Trong kịch bản bash của tôi, tôi có

version=`cd $project_loc && mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | sed -n -e '/^\[.*\]/ !{ /^[0-9]/ { p; q } }'`

Cung cấp cho tôi phiên bản hiện tại mà sau đó tôi có thể tiến lên. Việc cắt xén có thể đơn giản hơn nhưng tôi nghĩ tôi muốn mạnh mẽ nhất có thể, vì vậy tôi hài lòng với dòng đầu tiên bắt đầu bằng một số và cố gắng xử lý đây là số phiên bản.

# Advances the last number of the given version string by one.
function advance_version () {
    local v=$1
    # Get the last number. First remove any suffixes (such as '-SNAPSHOT').
    local cleaned=`echo $v | sed -e 's/[^0-9][^0-9]*$//'`
    local last_num=`echo $cleaned | sed -e 's/[0-9]*\.//g'`
    local next_num=$(($last_num+1))
    # Finally replace the last number in version string with the new one.
    echo $v | sed -e "s/[0-9][0-9]*\([^0-9]*\)$/$next_num/"
}

Và tôi sử dụng điều này bằng cách gọi

new_version=$(advance_version $version)

Hy vọng điều này sẽ giúp được ai đó.


1
Giải pháp dường như bỏ lỡ một 'để kết thúc biểu thức sed.
nawroth

Mà exp exp? Tôi dường như không thể nhận thấy.
mkko

1
biến nó thành mvn -o để thực hiện nhanh hơn
Nathan Bubna

2
Bạn có thể thay thế biểu thức sed phức tạp đó bằng một đơn giảngrep -e '^[[:digit:]]'
bpedman

2
Nếu bạn sử dụng -o theo khuyến nghị của @NathanBubna thì điều đó sẽ đưa maven ở chế độ 'ngoại tuyến'. Nếu bạn chưa có plugin trợ giúp maven và các lọ phụ thuộc được tải xuống thì quá trình xây dựng sẽ thất bại. Bị đốt cháy bởi điều đó một chút, hy vọng nó sẽ giúp người khác.
phillipuniverse

Câu trả lời:


217

Các Maven Trợ giúp Plugin được bằng cách nào đó đã đề nghị một cái gì đó cho việc này:

  • help:evaluate đánh giá các biểu thức Maven do người dùng đưa ra trong chế độ tương tác.

Đây là cách bạn sẽ gọi nó trên dòng lệnh để có được ${project.version}:

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
    -Dexpression=project.version

8
Được rồi, cảm ơn. Tôi nghĩ rằng đây là cách gần nhất tôi sẽ có được một giải pháp sạch. Bất kỳ ý tưởng làm thế nào tôi có thể thay thế đầu ra maven và lọc ra những [INFO]tin nhắn? Tôi đã không tìm thấy một công tắc cho maven. Nếu không, tôi sẽ chỉ thêm một số kịch bản dòng lệnh để phân tích số phiên bản.
mkko

80
Tôi đang xóa tất cả các bản ghi nhật ký (INFO, CẢNH BÁO, v.v.) và 'Tải xuống' vớimvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version|grep -Ev '(^\[|Download\w+:)'
Chadwick

13
sẽ không mong đợi bất cứ điều gì ít dài dòng hơn từ maven
Andy

24
Đây là một cách tiếp cận tôi ủng hộ:printf 'VERSION=${project.version}\n0\n' | mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate | grep '^VERSION'
tro

40
@montoyaed đăng câu trả lời tốt nhất mà đơn giản là mvn help:evaluate -Dexpression=project.version -q -DforceStdout. Để nắm bắt nó trong một biến trong Bash sử dụngversion=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
Sebastian Thomschke

200

Giải pháp của Tom với Plugin Exec Maven tốt hơn nhiều, nhưng vẫn phức tạp hơn mức cần thiết. Đối với tôi nó đơn giản như:

MVN_VERSION=$(mvn -q \
    -Dexec.executable=echo \
    -Dexec.args='${project.version}' \
    --non-recursive \
    exec:exec)

30
Tôi nghĩ rằng đây là cách dễ nhất vì nó không ngụ ý sử dụng grep hoặc những thứ tương tự. Ghi chú nhanh: bạn có thể làm cho nó ngắn hơn một chút:mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive exec:exec
Scrutari

1
Giải pháp này làm việc tốt cho tôi khi tôi muốn in groupId, artifactId và phiên bản .. -Dexec.args='${project.groupId}:${project.artifactId}:${project.version}'.
James H.

1
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.3.2:exec (default-cli) on project audit-events-processor-parent: Command execution failed. Cannot run program "maven" (in directory "/tmp"): error=2, No such file or directory nhún vai một câu trả lời khác không phù hợp với tôi, ồ tốt
cbmanica

Cảm ơn bạn đây là giải pháp tốt nhất tôi đã thấy cho đến nay, vì nó không yêu cầu áp dụng các lệnh grep / sed dễ vỡ hoặc tương tự
Mike76

Cái gì làset -o errexit
theonlygusti

80

Tôi đã thực hiện một số nghiên cứu và tìm thấy như sau:

  1. Maven đã bị đổ lỗi vì việc tích hợp với các công cụ DevOps là không dễ dàng do thực tế là nó không tuân theo một số thực tiễn tốt về các công cụ CLI. (tham khảo: https://youtu.be/1ILEw6Qca3U?t=372 )

  2. Lấy cảm hứng từ khẳng định trước đó, tôi quyết định xem xét mã nguồn của maven cũng như trên plugin maven-help-plugin. Có vẻ như họ đã sửa một chút công tắc -q của maven (Tôi đang sử dụng phiên bản 3.5.3), vì vậy bây giờ nếu bạn vượt qua nó, bạn sẽ không nhận được tất cả các công cụ ghi nhật ký vô nghĩa gây phiền nhiễu ngăn maven sử dụng trong các kịch bản tự động. Vì vậy, bạn sẽ có thể sử dụng một cái gì đó như thế này:

    mvn help:evaluate -Dexpression=project.version -q

    Vấn đề là lệnh này không in gì cả vì theo mặc định, plugin trợ giúp xuất ra thông qua bộ ghi đã bị tắt bởi công tắc -q. (phiên bản mới nhất có sẵn của plugin là 3.1.0 được phát hành vào tháng 6, 3 năm 2018)

  3. Karl Heinz Marbaise ( https://github.com/khmarbaise ) đã sửa nó bằng cách thêm một tham số tùy chọn cho phép bạn gọi nó theo cách sau:

    mvn help:evaluate -Dexpression=project.version -q -DforceStdout

    Mô tả cam kết có sẵn tại: ( https://github.com/apache/maven-help-plugin/commit/316656983d780c04031bbadd97d4ab245c84d014 )


2
Đây sẽ là giải pháp ưa thích của tôi và cũng được đề cập trên các trang trợ giúp chính thức . Tuy nhiên, nó không làm việc cho tôi. Tôi đang dùng MacOS với Maven v3.5.3. Khi tôi không sử dụng công -qtắc, nó sẽ in ra phiên bản chính xác (ở giữa các dòng nhật ký). Có ý kiến ​​gì không?
gucce

3
Đây phải là câu trả lời được chấp nhận. Nó hoạt động trong Windows và Linux (Tôi đã không thử Max OSX), và nó đơn giản. Cảm ơn bạn.
thùng rác

1
@montoyaedu Xin lỗi vì đã không trả lời. Trong khi đó, tôi đã cập nhật lên maven 3.5.4 hoạt động tốt với công -qtắc.
gucce

1
@gucce Tôi có thể xác nhận rằng phiên bản maven được sử dụng ảnh hưởng đến điều này: với 3.5.2 (phiên bản gói trên debian 9) đầu ra -q -DforceStdouttrống, thậm chí đảm bảo phiên bản 3.1.0 của plugin đã được sử dụng với pluginQuản lý); tôi đã cấu hình trình bao bọc maven với phiên bản 3.5.4 của maven và nó hoạt động chính xác
Gorkk

3
Cuối cùng, một giải pháp thực tế không có grep cho năm 2019 - (điều này sẽ trở thành câu trả lời được chấp nhận). Cũng hoạt động với các phiên bản thân thiện với CI - được thử nghiệm trên 3.3.9, 3.5.3, 3.5.4, 3.6.0
Ed Randall

47
mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['

2
làm cho mvn -o để thực hiện nhanh hơn
Nathan Bubna

1
Xem câu trả lời của tôi (quickshiftin) bên dưới các bộ lọc 'Đã tải xuống:'.
quickshiftin

10
Nếu bạn sử dụng -o theo khuyến nghị của @NathanBubna thì điều đó sẽ đưa maven ở chế độ 'ngoại tuyến'. Nếu bạn chưa có plugin trợ giúp maven và các lọ phụ thuộc được tải xuống thì quá trình xây dựng sẽ thất bại. Bị đốt cháy bởi điều đó một chút, hy vọng nó sẽ giúp người khác.
phillipuniverse

Bạn cũng có thể muốn thêm 2> /dev/nullnếu không bạn có thể nhận đượcPicked up _JAVA_OPTIONS:
Jakub Bochenski

2
Trên Windows, thay thế kết thúc lệnh bằng | findstr /v "[".
Tunaki

39

Câu trả lời hàng đầu là khá rác theo ý kiến ​​của tôi, bạn phải sử dụng một loạt các grep để hack đầu ra giao diện điều khiển maven. Tại sao không sử dụng đúng công cụ cho công việc? Sử dụng cú pháp xpath là cách tiếp cận tốt nhất để truy xuất số phiên bản, vì đây là phương pháp dự định truy cập cấu trúc dữ liệu XML. Biểu thức bên dưới đang duyệt qua pom bằng cách sử dụng "tên cục bộ" của các phần tử, nói cách khác là bỏ qua các khai báo không gian tên có thể có hoặc không có trong xml.

xmllint --xpath "//*[local-name()='project']/*[local-name()='version']/text()" pom.xml

@bobmarkie Tôi thứ hai mà; sử dụng maven và cọ rửa đầu ra với regrec là đau đớn.
mhvelplund

3
Điều gì về một dự án kế thừa từ một phụ huynh.
Wes

2
"Tại sao không sử dụng đúng công cụ cho công việc?" IE! Maven?
jeremyjjbrown

Tôi hiểu rằng sử dụng mvnlà cách tiếp cận phù hợp và execplugin thực sự hoạt động tốt, nhưng tất cả các giải pháp mvn đều phải giải quyết và tôi đang cố gắng khởi động một đường ống xây dựng nơi độ phân giải phụ thuộc sẽ không hoạt động, vì vậy tôi sẽ thay thế execcách tiếp cận bằng giải pháp này. May mắn thay, tôi không phải lo lắng về các phiên bản được thừa hưởng từ cha mẹ.
haridsv

Điều này sẽ không hoạt động với phiên bản thân thiện với ci, ${revision}ví dụ như phiên bản là một tài sản . Tham chiếu maven.apache.org/maven-ci-friendly.html
Ed Randall

30

Điều này sẽ tránh sự cần thiết phải loại bỏ các mục nhật ký từ đầu ra:

mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do tại sao và / hoặc cách nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị lâu dài của nó. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số lời giải thích.
Toby Speight

1
Tôi nghĩ đối với phương pháp này, cần phải đặt "-q" sau mvn.
Rudge

Điều này là tốt hơn so với giải pháp được chấp nhận; không cần phải lọc ra đầu ra ồn ào.
Willian Mitsuda

20

Đây là giải pháp sạch nhất tôi tìm thấy:

mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout

Ưu điểm:

  • Điều này hoạt động tốt trên tất cả các hệ điều hành và tất cả các shell.
  • Không cần bất kỳ công cụ bên ngoài!

Ghi chú:

  • maven-help-pluginphiên bản 3.2.0(và ở trên) có forceStdouttùy chọn. Bạn có thể thay thế 3.2.0lệnh trên bằng phiên bản mới hơn từ danh sách các phiên bản có sẵn của mvn-help-plugin từ artifactory, nếu có.
  • Tùy chọn -qngăn chặn các thông điệp dài dòng ( [INFO], [WARN]v.v.)

Nếu bạn muốn tìm nạp groupIdartifactIdtốt, hãy kiểm tra câu trả lời này .


13
python -c "import xml.etree.ElementTree as ET; \
  print(ET.parse(open('pom.xml')).getroot().find( \
  '{http://maven.apache.org/POM/4.0.0}version').text)"

Miễn là bạn có python 2.5 trở lên, điều này sẽ hoạt động. Nếu bạn có phiên bản thấp hơn thế, hãy cài đặt python-lxmlvà thay đổi nhập thành lxml.etree. Phương pháp này nhanh chóng và không yêu cầu tải xuống bất kỳ bổ sung nào. Nó cũng hoạt động trên các tệp pom.xml không đúng định dạng không xác thực bằng xmllint, giống như các tệp tôi cần phân tích. Đã thử nghiệm trên Mac và Linux.


12

Tôi tiếp tục gặp phải các trường hợp phụ khi sử dụng một số câu trả lời khác ở đây, vì vậy đây là một cách khác.

version=$(printf 'VER\t${project.version}' | mvn help:evaluate | grep '^VER' | cut -f2)

1
printf 'VER\t${project.version}' | mvn help:evaluate 2> /dev/null | grep '^VER' | cut -f2
yegeniy

7

Nếu bạn không muốn ghi phiên bản vào một tệp tạm thời, có một giải pháp khác (không có grep / sed) phù hợp với tôi. ( EDIT : xem câu trả lời của rjrjr để có giải pháp đơn giản hơn nhiều mà không gặp rắc rối với tệp tạm thời)

Tôi sử dụng Plugin Exec Maven cùng với echonhị phân. Trái ngược với Plugin trợ giúp Maven, Plugin Exec cho phép chuyển hướng đầu ra thành một tệp, có thể được sử dụng để bỏ qua grep / sed và thậm chí có thể phân tích những thứ lạ như chuỗi phiên bản đa dòng (với khối CDATA trong thẻ phiên bản), ít nhất là đến một mức độ nhất định.

#!/usr/bin/env sh

MVN_VERSION=""
VERSION_FILE=$( mktemp mvn_project_version_XXXXX )
trap "rm -f -- \"$VERSION_FILE\"" INT EXIT

mvn -Dexec.executable="echo" \
    -Dexec.args='${project.version}' \
    -Dexec.outputFile="$VERSION_FILE" \
    --non-recursive \
    --batch-mode \
    org.codehaus.mojo:exec-maven-plugin:1.3.1:exec > /dev/null 2>&1 ||
    { echo "Maven invocation failed!" 1>&2; exit 1; }

# if you just care about the first line of the version, which will be
# sufficent for pretty much every use case I can imagine, you can use
# the read builtin
[ -s "$VERSION_FILE" ] && read -r MVN_VERSION < "$VERSION_FILE"

# Otherwise, you could use cat.
# Note that this still has issues when there are leading whitespaces
# in the multiline version string
#MVN_VERSION=$( cat "$VERSION_FILE" )

printf "Maven project version: %s\n" "$MVN_VERSION"

6
Đây là một giải pháp tốt hơn nhiều so với plugin trợ giúp và bạn không cần tất cả những gì tôi / o. Chỉ cần thêm một cờ -q và đầu ra duy nhất sẽ là phiên bản. Vì vậy: mvn -q -Dexec.executable = "echo" -Dexec.args = '$ {project.version}' --non-recursive org.codehaus.mojo: exec-maven-plugin: 1.3.1: exec
rjrjr

rjrjr: Tuyệt vời! Điều duy nhất tôi cần đề cập ở đây là xử lý lỗi: Nếu mvn không thành công, bạn sẽ nhận được chuỗi phiên bản không hợp lệ. Vì vậy, một số xác nhận là bắt buộc, như kiểm tra mã trả về mvn hoặc chính chuỗi.
Tom

6

Chỉ để ghi lại, có thể định cấu hình ghi nhật ký SLF4J đơn giản của Maven trực tiếp trong dòng lệnh để chỉ xuất ra những gì chúng ta cần bằng cách định cấu hình:

  • org.slf4j.simpleLogger.defaultLogLevel=WARN
  • org.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO

như tài liệu tại http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html

MAVEN_OPTS="\
-Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO" \
mvn help:evaluate -o -Dexpression=project.version

Kết quả là, người ta có thể chạy đơn giản tail -1và nhận được:

$ MAVEN_OPTS="\
-Dorg.slf4j.simpleLogger.defaultLogLevel=WARN \
-Dorg.slf4j.simpleLogger.log.org.apache.maven.plugins.help=INFO" \
mvn help:evaluate -o -Dexpression=project.version | tail -1

1.0.0-SNAPSHOT

Lưu ý rằng đây là một lót. MAVEN_OPTSđang được viết lại chỉ cho việc mvnthực hiện cụ thể này .


5

Tôi nhận thấy một số Downloaded:dòng giả trong đầu ra đã phá vỡ nhiệm vụ ban đầu của tôi. Đây là bộ lọc tôi đã giải quyết; hy vọng nó giúp!

version=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | egrep -v '^\[|Downloading:' | tr -d ' \n')

BIÊN TẬP

Không chắc chắn 100% lý do tại sao, nhưng khi chạy nó thông qua một kịch bản hậu xây dựng trong Jenkins, đầu ra sẽ xuất hiện dưới dạng [INFO]version, ví dụ [INFO]0.3.2.

Tôi đã đổ đầu ra vào một tệp và chạy nó qua bộ lọc đầu tiên của tôi trực tiếp từ BASH, nó hoạt động tốt .., vì vậy, một lần nữa, không chắc chắn những gì đang xảy ra ở vùng đất Jenkins.

Để có được 100% trong Jenkins, tôi đã thêm sedbộ lọc theo dõi ; đây là mới nhất của tôi

version=$(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | egrep -v '^\[|Downloading:' | tr -d ' \n' | sed -E 's/\[.*\]//g')

BIÊN TẬP

Một lưu ý cuối cùng ở đây .. tôi phát hiện ra trđược vẫn dẫn đến những thứ như /r/n0.3.2(một lần nữa chỉ khi chạy qua Jenkins). Chuyển sang awkvà vấn đề đã biến mất! Kết quả làm việc cuối cùng của tôi

mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version \
| egrep -v '^\[|Downloading:' | sed 's/[^0-9\.]//g' | awk 1 ORS=''

5

Một giải pháp đơn giản chỉ dành cho maven

mvn -q -N org.codehaus.mojo:exec-maven-plugin:1.3.1:exec \
    -Dexec.executable='echo' \
    -Dexec.args='${project.version}'

Và đối với điểm thưởng được phân tích cú pháp một phần của phiên bản

mvn -q -N org.codehaus.mojo:build-helper-maven-plugin:3.0.0:parse-version \
    org.codehaus.mojo:exec-maven-plugin:1.3.1:exec \
    -Dexec.executable='echo' \
    -Dexec.args='${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}'

5

Gần đây tôi đã phát triển plugin Maven Ứng viên Phát hành để giải quyết vấn đề chính xác này để bạn không phải dùng đến bất kỳ tập lệnh shell hack nào và phân tích cú pháp đầu ra của maven-help-plugin.

Ví dụ: để in phiên bản dự án Maven của bạn sang thiết bị đầu cuối, hãy chạy:

mvn com.smartcodeltd:release-candidate-maven-plugin:LATEST:version

cung cấp đầu ra tương tự như maven-help-plugin:

[INFO] Detected version: '1.0.0-SNAPSHOT'
1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Tuy nhiên, bạn cũng có thể chỉ định một định dạng đầu ra tùy ý (để có thể chọn phiên bản từ nhật ký của máy chủ CI như TeamCity ):

mvn com.smartcodeltd:release-candidate-maven-plugin:LATEST:version \
   -DoutputTemplate="##teamcity[setParameter name='env.PROJECT_VERSION' value='{{ version }}']"

Kết quả nào trong:

[INFO] Detected version: '1.0.0-SNAPSHOT'
##teamcity[setParameter name='env.PROJECT_VERSION' value='1.0.0-SNAPSHOT']
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Để lưu đầu ra vào một tệp (để máy chủ CI như Jenkins có thể sử dụng tệp đó ):

mvn com.smartcodeltd:release-candidate-maven-plugin:LATEST:version \
   -DoutputTemplate="PROJECT_VERSION={{ version }}" \
   -DoutputUri="file://\${project.basedir}/version.properties"

Các version.propertiestập tin kết quả sẽ trông như sau:

PROJECT_VERSION=1.0.0-SNAPSHOT

Ngoài tất cả những điều trên, Ứng viên phát hành cũng cho phép bạn đặt phiên bản dự án của bạn (đây là điều bạn có thể làm trên máy chủ CI) dựa trên phiên bản API bạn đã xác định trong POM.

Nếu bạn muốn xem một ví dụ về Ứng cử viên phát hành đang được sử dụng như một phần của vòng đời Maven, hãy xem pom.xmldự án nguồn mở khác của tôi - Build Monitor cho Jenkins .


5

Ngoài ra còn có một tùy chọn mà không cần Maven:

grep -oPm1 "(?<=<version>)[^<]+" "pom.xml"

Điều này chỉ cho thấy sự xuất hiện đầu tiên trong pom. Trong trường hợp của tôi lần đầu tiên xuất hiện cho cha mẹ phiên bản pom. Nhưng thành thật mà nói đây là câu trả lời tôi đang tìm kiếm. Nó nhanh hơn nhiều so với các giải pháp được đề cập trước đó và thật dễ dàng để sửa đổi nó để có được sự xuất hiện đúng đắn. Để có được lần sử dụng thứ hai: grep -oPm2 "(?<=<version>)[^<]+" pom.xml | sed -n 2pĐể có được lần xuất hiện thứ ba grep -oPm3 "(?<=<version>)[^<]+" pom.xml | sed -n 3p, v.v.
Krzysztof Cieśliński

Bạn đang giả sử phần tử phiên bản là lần xuất hiện đầu tiên và nó không hoạt động khi giả định không hợp lệ.
devildelta

3

Giải pháp dễ hiểu tất cả trong một tạo ra phiên bản dự án maven và triệt tiêu đầu ra bên ngoài [INFO]Downloadtin nhắn:

mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['

Điều tương tự, nhưng chia thành hai dòng:

mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
      -Dexpression=project.version | grep -v '\['

Đầu ra: 4.3-SNAPSHOT

Vì vậy, sử dụng project.versiontập lệnh bash đơn giản của bạn :

projectVersion=`mvn -o org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep -v '\['`
cd "target/"$projectVersion"-build"

Các giải pháp khác trên trang này dường như không kết hợp tất cả các thủ thuật thành một.



3

Đây là giải pháp bash cut và dán dễ dàng nhất:

VERSION=$(mvn -Dexec.executable='echo' -Dexec.args='${project.version}' --non-recursive exec:exec -q)
echo $VERSION

nó vang

1.4

2

Tôi tìm thấy sự cân bằng phù hợp với tôi. Sau khi mvn packageplugin maven-archiver tạo ra target/maven-archiver/pom.propertiesvới nội dung như thế này

version=0.0.1-SNAPSHOT
groupId=somegroup
artifactId=someArtifact

và tôi đang sử dụng bash chỉ để thực thi nó

. ./target/maven-archiver/pom.properties

sau đó

echo $version
0.0.1-SNAPSHOT

Tất nhiên điều này không an toàn chút nào để thực thi tệp này, nhưng thực thi có thể dễ dàng được chuyển đổi thành tập lệnh perl hoặc bash để đọc và đặt biến môi trường từ tệp đó.


1

Điều này làm việc cho tôi, ngoại tuyến và không phụ thuộc vào mvn:

VERSION=$(grep --max-count=1 '<version>' <your_path>/pom.xml | awk -F '>' '{ print $2 }' | awk -F '<' '{ print $1 }')
echo $VERSION

1

Plugin Exec hoạt động mà không có bất kỳ phân tích cú pháp đầu ra nào vì đầu ra có thể được chuyển hướng vào tệp và được đưa trở lại môi trường công việc thông qua plugin EnvInject:

nhập mô tả hình ảnh ở đây


1

Dựa trên câu hỏi, tôi sử dụng tập lệnh này bên dưới để tự động tăng số phiên bản của mình trong tất cả các phụ huynh / mô hình con maven:

#!/usr/bin/env bash  

# Advances the last number of the given version string by one.  
function advance\_version () {  
    local v=$1  
    \# Get the last number. First remove any suffixes (such as '-SNAPSHOT').  
  local cleaned=\`echo $v | sed \-e 's/\[^0-9\]\[^0-9\]\*$//'\`  
 local last\_num=\`echo $cleaned | sed \-e 's/\[0-9\]\*\\.//g'\`  
 local next\_num=$(($last\_num+1))  
  \# Finally replace the last number in version string with the new one.  
  echo $v | sed \-e "s/\[0-9\]\[0-9\]\*\\(\[^0-9\]\*\\)$/$next\_num/"  
}  

version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout)  

new\_version=$(advance\_version $version)  

mvn versions:set -DnewVersion=${new\_version} -DprocessAllModules -DgenerateBackupPoms=false

0

Hoặc bạn đã mvncung cấp cho bạn câu trả lời (như hầu hết các câu trả lời gợi ý) hoặc bạn trích xuất câu trả lời từ pom.xml. Hạn chế duy nhất của cách tiếp cận thứ hai là bạn có thể dễ dàng trích xuất giá trị của <version/>thẻ, nhưng nó sẽ chỉ có ý nghĩa nếu nó theo nghĩa đen , nghĩa là, không phải là thuộc tính Maven. Dù sao tôi cũng chọn cách tiếp cận này vì:

  • mvn là cách để tiết lộ và tôi chỉ đơn giản là không thích lọc đầu ra của nó.
  • Bắt đầu mvnlà rất chậm so với đọc pom.xml.
  • Tôi luôn luôn sử dụng các giá trị theo nghĩa đen <version/>.

mvn-versionlà một zshtập lệnh shell sử dụng xmlstarletđể đọc pom.xmlvà in phiên bản của dự án (nếu nó tồn tại) hoặc phiên bản của dự án mẹ (nếu nó tồn tại):

$ mvn-version .
1.0.0-SNAPSHOT

Ưu điểm là nó cách nhanh hơn chạy mvn:

$ time mvn-version .
1.1.0-SNAPSHOT
mvn-version .  0.01s user 0.01s system 75% cpu 0.019 total

$ time mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
> -Dexpression=project.version
mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate   4.17s user 0.21s system 240% cpu 1.823 total

Sự khác biệt trên máy của tôi lớn hơn hai bậc độ lớn.


0

Tôi cần chính xác yêu cầu này trong công việc Travis của tôi nhưng với nhiều giá trị. Tôi bắt đầu với giải pháp này nhưng khi gọi nhiều lần thì điều này rất chậm (tôi cần 5 lần thể hiện).

Tôi đã viết một plugin maven đơn giản để trích xuất các giá trị của pom.xml vào tệp .sh.

https://github.com/famaridon/ci-tools-maven-plugin

mvn com.famaridon:ci-tools-maven-plugin:0.0.1-SNAPSHOT:environment -Dexpressions=project.artifactId,project.version,project.groupId,project.build.sourceEncoding

Sẽ tạo ra rằng:

#!/usr/bin/env bash
CI_TOOLS_PROJECT_ARTIFACTID='ci-tools-maven-plugin';
CI_TOOLS_PROJECT_VERSION='0.0.1-SNAPSHOT';
CI_TOOLS_PROJECT_GROUPID='com.famaridon';
CI_TOOLS_PROJECT_BUILD_SOURCEENCODING='UTF-8';

bây giờ bạn có thể chỉ cần nguồn tập tin

source .target/ci-tools-env.sh

Chúc vui vẻ.


-1

Tôi đang sử dụng một lớp lót trong vỏ unix của mình ...

mèo pom.xml | grep "" | đầu -n 1 | sed -e "s / phiên bản // g" | sed -e "s / \ s * [<> /] * // g"

Bạn có thể ẩn dòng này trong tập lệnh shell hoặc dưới dạng bí danh.


-1

đây là bản chỉnh sửa từ phía trên

mèo pom.xml | grep "" | đầu -n 1 | sed -e "s / phiên bản // g" | sed -e "s / \ s * [<> /] * // g"

Tôi đã thử nghiệm nó trên cmdline hoạt động tốt

grep "" pom.xml | đầu -n 1 | sed -e "s / phiên bản // g" | sed -e "s / \ s * [<> /] * // g"

là một phiên bản khác của cùng. Tôi có nhu cầu lấy số phiên bản trong Jenkins CI trong k8s mà không cài đặt mvn nên điều này hữu ích nhất

cảm ơn tất cả.


-2
mvn help:evaluate -Dexpression=project.version | sed -e 1h -e '2,3{H;g}' -e '/\[INFO\] BUILD SUCCESS/ q' -e '1,2d' -e '{N;D}' | sed -e '1q'

Tôi chỉ thêm sedcải tiến bộ lọc nhỏ mà tôi đã thực hiện gần đây để trích xuất project.versiontừ đầu ra maven.


-2
VERSION=$(head -50 pom.xml | awk -F'>' '/SNAPSHOT/ {print $2}' | awk -F'<' '{print $1}')

Đây là những gì tôi đã sử dụng để có được số phiên bản, nghĩ rằng sẽ có một cách tốt hơn để làm như vậy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.