Cách chuyển các tùy chọn JVM từ bootRun


99

Tôi đang phát triển ứng dụng web Spring đơn giản giao tiếp với máy chủ từ xa và tôi muốn thử nghiệm nó cục bộ sau proxy của công ty. Tôi sử dụng plugin gradle "Spring Boot" và câu hỏi là làm cách nào tôi có thể chỉ định cài đặt proxy cho JVM?

Tôi đã thử một số cách để làm điều đó:

  1. gradle -Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080 bootRun
  2. export JAVA_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"
  3. export GRADLE_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"

Nhưng có vẻ như không có cái nào trong số chúng hoạt động - "NoRouteToHostException" ném vào mã "mạng". Ngoài ra, tôi đã thêm một số mã bổ sung để gỡ lỗi các đối số bắt đầu JVM:

    RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
    List<String> arguments = runtimeMxBean.getInputArguments();
    for (String arg: arguments) System.out.println(arg);

Và chỉ có một đối số được in: "-Dfile.encoding = UTF-8".

Nếu tôi đặt thuộc tính hệ thống trong mã:

    System.setProperty("http.proxyHost", "X.X.X.X");
    System.setProperty("http.proxyPort", "8080");

Mọi thứ hoạt động tốt!

Câu trả lời:


107

Câu trả lời gốc (sử dụng Gradle 1.12 và Spring Boot 1.0.x):

Các bootRunnhiệm vụ của các plugin gradle Xuân Boot mở rộng nhiệm vụ JavaExec gradle. Xem này .

Điều đó có nghĩa là bạn có thể định cấu hình plugin để sử dụng proxy bằng cách thêm:

bootRun {
   jvmArgs = "-Dhttp.proxyHost=xxxxxx", "-Dhttp.proxyPort=xxxxxx"
}

vào tệp bản dựng của bạn.

Tất nhiên bạn có thể sử dụng systemPropertiesthay vìjvmArgs

Nếu bạn muốn thêm jvmArgs có điều kiện từ dòng lệnh, bạn có thể làm như sau:

bootRun {
    if ( project.hasProperty('jvmArgs') ) {
        jvmArgs project.jvmArgs.split('\\s+')
    }
}

gradle bootRun -PjvmArgs="-Dwhatever1=value1 -Dwhatever2=value2"

Câu trả lời cập nhật:

Sau khi thử giải pháp của tôi ở trên bằng cách sử dụng Spring Boot 1.2.6.RELEASEGradle 2.7, tôi nhận thấy rằng nó không hoạt động như một số nhận xét đã đề cập. Tuy nhiên, có thể thực hiện một vài chỉnh sửa nhỏ để khôi phục trạng thái hoạt động.

Mã mới là:

bootRun {
   jvmArgs = ["-Dhttp.proxyHost=xxxxxx", "-Dhttp.proxyPort=xxxxxx"]
}

cho các đối số được mã hóa cứng và

bootRun {
    if ( project.hasProperty('jvmArgs') ) {
        jvmArgs = (project.jvmArgs.split("\\s+") as List)

    }
}

cho các đối số được cung cấp từ dòng lệnh


4
Tôi không muốn có tùy chọn này "mã hóa cứng" trong tệp xây dựng. Sẽ thật tuyệt nếu có khả năng chỉ định cài đặt proxy. Tức là - sử dụng các đối số dòng lệnh.
Evgeny

Không hoạt động: "> Không thể tìm thấy thuộc tính 'args' trên dự án gốc".
Evgeny

Bạn đã sao chép đúng mã? Tôi đã cập nhật. Không có argstài sản.
geoand

7
Tôi đã thử hôm nay và cách duy nhất để làm việc này là lướt danh sách chuỗi bằng dấu ngoặc vuông, như bootRun {jvmArgs = ["-Dhttp.proxyHost = xxxxxx", "-Dhttp.proxyPort = xxxxxx"]}
Valentino Dell ' Aica

Bạn đang sử dụng phiên bản gradle nào?
geoand

72
bootRun {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

Điều này sẽ chuyển tất cả các tùy chọn JVM đến ứng dụng đã bắt đầu qua bootRun.


2
Đây là cách tốt nhất để chuyển các tùy chọn dòng lệnh sang JVM
anubhava

@Marvin Frommhold, cảm ơn câu trả lời của bạn. Cách tiếp cận là cực kỳ đơn giản. Đối với những người trẻ tuổi như tôi, sẽ rất hữu ích nếu bạn thêm một chút chi tiết. Gợi ý: (1) hiển thị lệnh gọi dòng lệnh gradle với các đối số; (2) chỉ ra cách tham chiếu các đối số trong Spring Boot, ví dụ: @Value ("$ {property: default}"); (3) Ảnh chụp màn hình hộp thoại IntelliJ chuyển các tham số cũng sẽ hữu ích.
Brett

1
Đáng buồn thay, đối với tôi, chỉ cần thêm nguyên nhân này gradle bootRun thất bại khủng khiếp với "org.apache.catalina.LifecycleException: Một container đứa trẻ thất bại trong quá trình khởi" ngay cả khi không đi qua bất kỳ params -D
tkruse

Giải quyết bằng cách cherry-chọn các thuộc tính tôi muốn như trong một câu trả lời cho stackoverflow.com/questions/23689054
tkruse

7

Trong tập lệnh xây dựng gradle, hãy xác định systemProperties cho tác vụ đang chạy.

//to provide the properties while running the application using spring-boot's run task
    run {
        systemProperties['property name'] = 'value'
    }

gradle runnên chấp nhận giá trị này.

Hoặc xác định thuộc tính cấp dự án như được đề cập trong http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run


1
Có, giải pháp này hoạt động. Nhưng tôi không muốn có mã này dưới sự kiểm soát nguồn. Tôi tin rằng giải pháp "đúng đắn nhất" là chuyển các tùy chọn này trực tiếp trong dòng lệnh. Có cách nào cho nó không?
Evgeny

1
Các liên kết được đề cập trong bài có một cách để đi qua chúng từ dòng lệnh
Suman j

5

@marvin, cảm ơn vì bài đăng của bạn rất hữu ích.

Chia sẻ cách tôi sử dụng nó:

test {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

Tôi có các bài kiểm tra JUnit mà tôi muốn bỏ qua trừ khi một thuộc tính được sử dụng để bao gồm các bài kiểm tra như vậy. Sử dụng JUnit Assume để bao gồm các bài kiểm tra có điều kiện:

//first line of test
assumeThat(Boolean.parseBoolean(System.getProperty("deep.test.run","false"),true)

Thực hiện điều này với gradle yêu cầu thuộc tính hệ thống được cung cấp tại thời điểm chạy bản dựng gradle, được hiển thị ở đây,

gradle build -Ddeep.test.run=true

đã thực sự vượt qua các bài kiểm tra.

Hy vọng điều này sẽ giúp những người khác đang thử phương pháp này để chạy thử nghiệm có điều kiện.


3
bootRun {
  args = ['myProgramArgument1', 'myProgramArgument2']
}

Sử dụng jvmArgs có thể gây ra sự cố khởi động JVM. Sử dụng args cho phép bạn chuyển các đối số chương trình tùy chỉnh của mình


Bạn có thể chỉ cho tôi cách sử dụng các đối số này trong Application.class hoặc trong Bootstrap.class không? (Tôi đang sử dụng grails 3.xx)
Stefano Scarpanti

2

Nó dường như hoạt động:

bootRun {
    systemProperties "property1": "value1", "property2": "value2"
}

1

Tôi gặp sự cố tương tự, bootRun cần một số tham số nhưng tôi sẽ không cảm thấy muốn sửa đổi bootRun vì tôi muốn giữ một số tính linh hoạt và bám vào hành vi bootRun tiêu chuẩn. Đề xuất của tôi là thêm một số tác vụ tùy chỉnh (giả sử bootRunDev, bootRunProxy) mở rộng bootRun, như được mô tả trong đoạn mã sau

task bootRunPxy(type: org.springframework.boot.gradle.run.BootRunTask, dependsOn: 'build') {
    group = 'Application'
    doFirst() {
        main = project.mainClassName
        classpath = sourceSets.main.runtimeClasspath
        systemProperty 'http.proxyHost', 'xxxxx'
        systemProperty 'http.proxyPort', 'yyyyy'
    }
}

Tôi không có môi trường để thực hiện tập lệnh nhưng tôi đã sử dụng phương pháp này để chuyển hồ sơ sang mùa xuân bằng thuộc tính spring.profiles.active. Các khoản tín dụng sẽ được chuyển đến Karol Kaliński

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.