Skip to content

Commit 0db2dba

Browse files
committed
Merge 114796053-link-libraries to master
[Completes #114796053]
2 parents 4e7980a + 0baaa6a commit 0db2dba

7 files changed

Lines changed: 73 additions & 14 deletions

File tree

lib/java_buildpack/container/java_main.rb

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,19 @@ def detect
4545

4646
# (see JavaBuildpack::Component::BaseComponent#compile)
4747
def compile
48+
if @spring_boot_utils.is?(@application)
49+
@droplet.additional_libraries.link_to(@spring_boot_utils.lib(@droplet))
50+
end
4851
end
4952

5053
# (see JavaBuildpack::Component::BaseComponent#release)
5154
def release
52-
@droplet.additional_libraries.insert 0, @application.root
5355
manifest_class_path.each { |path| @droplet.additional_libraries << path }
5456

5557
if @spring_boot_utils.is?(@application)
5658
@droplet.environment_variables.add_environment_variable 'SERVER_PORT', '$PORT'
59+
else
60+
@droplet.additional_libraries.insert 0, @application.root
5761
end
5862

5963
release_text
@@ -68,18 +72,28 @@ def release
6872
private_constant :ARGUMENTS_PROPERTY, :CLASS_PATH_PROPERTY
6973

7074
def release_text
71-
[
75+
release = [
7276
@droplet.java_opts.as_env_var,
7377
'&&',
7478
@droplet.environment_variables.as_env_vars,
7579
'eval',
7680
'exec',
7781
"#{qualify_path @droplet.java_home.root, @droplet.root}/bin/java",
78-
'$JAVA_OPTS',
79-
@droplet.additional_libraries.as_classpath,
82+
'$JAVA_OPTS'
83+
]
84+
85+
if @spring_boot_utils.is?(@application)
86+
release << '-cp $PWD/.'
87+
else
88+
release << @droplet.additional_libraries.as_classpath
89+
end
90+
91+
release << [
8092
main_class,
8193
arguments
82-
].flatten.compact.join(' ')
94+
]
95+
96+
release.flatten.compact.join(' ')
8397
end
8498

8599
def arguments

lib/java_buildpack/util/spring_boot_utils.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ def is?(application)
3838
@jar_finder.is?(application)
3939
end
4040

41+
def lib(droplet)
42+
return web_inf_lib_dir(droplet) if web_inf_lib_dir(droplet).exist?
43+
return lib_dir(droplet) if lib_dir(droplet).exist?
44+
fail('No lib directory found')
45+
end
46+
4147
# The version of Spring Boot used by the application
4248
#
4349
# @param [Application] application the application to search
@@ -53,6 +59,14 @@ def version(application)
5359

5460
private_constant :SPRING_BOOT_VERSION
5561

62+
def lib_dir(droplet)
63+
droplet.root + 'lib'
64+
end
65+
66+
def web_inf_lib_dir(droplet)
67+
droplet.root + 'WEB-INF/lib'
68+
end
69+
5670
end
5771

5872
end

spec/fixtures/container_main_spring_boot_jar_launcher/lib/.gitignore

Whitespace-only changes.

spec/fixtures/container_main_spring_boot_properties_launcher/lib/.gitignore

Whitespace-only changes.

spec/fixtures/container_main_spring_boot_war_launcher/lib/.gitignore

Whitespace-only changes.

spec/java_buildpack/container/java_main_spec.rb

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,24 @@
5454
expect(component.detect).to be_nil
5555
end
5656

57+
it 'links additional libraries to the lib directory',
58+
app_fixture: 'container_main_spring_boot_jar_launcher' do
59+
60+
component.compile
61+
62+
lib = app_dir + 'lib'
63+
64+
test_jar_1 = lib + 'test-jar-1.jar'
65+
test_jar_2 = lib + 'test-jar-2.jar'
66+
expect(test_jar_1).to exist
67+
expect(test_jar_1).to be_symlink
68+
expect(test_jar_1.readlink).to eq((additional_libs_directory + 'test-jar-1.jar').relative_path_from(lib))
69+
70+
expect(test_jar_2).to exist
71+
expect(test_jar_2).to be_symlink
72+
expect(test_jar_2.readlink).to eq((additional_libs_directory + 'test-jar-2.jar').relative_path_from(lib))
73+
end
74+
5775
context do
5876
include_context 'explicit_main_class'
5977

@@ -88,31 +106,28 @@
88106
end
89107
end
90108

91-
it 'releases Spring boot applications with a JarLauncher in the MANIFEST.MF by specifying a port',
109+
it 'releases Spring boot applications with a JarLauncher in the MANIFEST.MF by specifying a port', :show_output,
92110
app_fixture: 'container_main_spring_boot_jar_launcher' do
93111

94112
expect(component.release).to eq('JAVA_OPTS="test-opt-2 test-opt-1" && test-var-2 test-var-1 SERVER_PORT=$PORT ' \
95113
"eval exec #{qualify_path java_home.root, droplet.root}/bin/java $JAVA_OPTS " \
96-
'-cp $PWD/.:$PWD/.additional_libs/test-jar-1.jar:$PWD/.additional_libs/' \
97-
'test-jar-2.jar org.springframework.boot.loader.JarLauncher')
114+
'-cp $PWD/. org.springframework.boot.loader.JarLauncher')
98115
end
99116

100117
it 'releases Spring boot applications with a WarLauncher in the MANIFEST.MF by specifying a port',
101118
app_fixture: 'container_main_spring_boot_war_launcher' do
102119

103120
expect(component.release).to eq('JAVA_OPTS="test-opt-2 test-opt-1" && test-var-2 test-var-1 SERVER_PORT=$PORT ' \
104121
"eval exec #{qualify_path java_home.root, droplet.root}/bin/java $JAVA_OPTS " \
105-
'-cp $PWD/.:$PWD/.additional_libs/test-jar-1.jar:$PWD/.additional_libs/' \
106-
'test-jar-2.jar org.springframework.boot.loader.WarLauncher')
122+
'-cp $PWD/. org.springframework.boot.loader.WarLauncher')
107123
end
108124

109125
it 'releases Spring boot applications with a PropertiesLauncher in the MANIFEST.MF by specifying a port',
110126
app_fixture: 'container_main_spring_boot_properties_launcher' do
111127

112128
expect(component.release).to eq('JAVA_OPTS="test-opt-2 test-opt-1" && test-var-2 test-var-1 SERVER_PORT=$PORT ' \
113129
"eval exec #{qualify_path java_home.root, droplet.root}/bin/java $JAVA_OPTS " \
114-
'-cp $PWD/.:$PWD/.additional_libs/test-jar-1.jar:$PWD/.additional_libs/' \
115-
'test-jar-2.jar org.springframework.boot.loader.PropertiesLauncher')
130+
'-cp $PWD/. org.springframework.boot.loader.PropertiesLauncher')
116131
end
117132

118133
end

spec/java_buildpack/util/spring_boot_utils_spec.rb

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
# limitations under the License.
1616

1717
require 'spec_helper'
18-
require 'application_helper'
18+
require 'droplet_helper'
1919
require 'java_buildpack/util/spring_boot_utils'
2020

2121
describe JavaBuildpack::Util::SpringBootUtils do
22-
include_context 'application_helper'
22+
include_context 'droplet_helper'
2323

2424
let(:utils) { described_class.new }
2525

@@ -65,4 +65,20 @@
6565
expect(utils.version(application)).to match(/1.2.5.RELEASE/)
6666
end
6767

68+
it 'returns WEB-INF/lib as lib directory' do
69+
FileUtils.mkdir_p(app_dir + 'WEB-INF/lib')
70+
71+
expect(utils.lib(droplet)).to eq(droplet.root + 'WEB-INF/lib')
72+
end
73+
74+
it 'returns lib as lib directory' do
75+
FileUtils.mkdir_p(app_dir + 'lib')
76+
77+
expect(utils.lib(droplet)).to eq(droplet.root + 'lib')
78+
end
79+
80+
it 'fails if there are no lib directories' do
81+
expect { utils.lib(droplet) }.to raise_error
82+
end
83+
6884
end

0 commit comments

Comments
 (0)