jruby-launcher 1.1.2-java → 1.1.3-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ require 'rbconfig'
2
+
3
+ mf = File.read('Makefile')
4
+ mf = mf.gsub(/^BINDIR\s*=.*$/, "BINDIR = #{Config::CONFIG['bindir']}")
5
+ mf = mf.gsub(/^PREFIX\s*=.*$/, "PREFIX = #{File.dirname(Config::CONFIG['libdir'])}")
6
+ puts mf
7
+ File.open('Makefile', 'wb') {|f| f << mf}
@@ -0,0 +1,3 @@
1
+ module JRubyLauncher
2
+ VERSION = "1.1.3"
3
+ end
@@ -0,0 +1,4 @@
1
+ class Gem::ConfigFile
2
+ PLATFORM_DEFAULTS['install'] = '--no-rdoc --no-ri'
3
+ PLATFORM_DEFAULTS['update'] = '--no-rdoc --no-ri'
4
+ end
@@ -0,0 +1,262 @@
1
+ require File.expand_path('../spec_helper.rb', __FILE__)
2
+ load File.expand_path('../../lib/jruby-launcher.rb', __FILE__)
3
+
4
+ describe "JRuby native launcher" do
5
+ it "should run org.jruby.Main" do
6
+ jruby_launcher_args("").last.should == "org/jruby/Main"
7
+ end
8
+
9
+ it "should pass unrecognized arguments to JRuby" do
10
+ jruby_launcher_args("-J-Dsome.option -v --help")[-3..-1].should == ["org/jruby/Main", "-v", "--help"]
11
+ end
12
+
13
+ it "should print help message" do
14
+ args = jruby_launcher_args("-Xhelp 2>&1")
15
+ args.select {|l| l =~ /JRuby Launcher usage/}.should_not be_empty
16
+ args.should include("-X")
17
+ args = jruby_launcher_args("-X 2>&1")
18
+ args.detect {|l| l =~ /JRuby Launcher usage/}.should_not be_empty
19
+ args.should include("-X")
20
+ end
21
+
22
+ it "should use $JAVACMD when JAVACMD is specified" do
23
+ with_environment "JAVACMD" => File.join("jato") do
24
+ if windows?
25
+ jruby_launcher_args("-v 2>&1").join.should =~ %r{jato}
26
+ else
27
+ jruby_launcher_args("-v").first.should == File.join("jato")
28
+ end
29
+ end
30
+ end
31
+
32
+ it "should use $JAVA_HOME/bin/java when JAVA_HOME is specified" do
33
+ with_environment "JAVA_HOME" => File.join("some", "java", "home") do
34
+ if windows?
35
+ jruby_launcher_args("-v 2>&1").join.should =~ %r{some/java/home}
36
+ else
37
+ jruby_launcher_args("-v").first.should == File.join("some", "java", "home", "bin", "java")
38
+ end
39
+ end
40
+ end
41
+
42
+ it "should use -Xjdkhome argument above JAVA_HOME" do
43
+ with_environment "JAVA_HOME" => File.join("env", "java", "home") do
44
+ if windows?
45
+ jruby_launcher_args("-Xjdkhome some/java/home 2>&1").join.should =~ %r{some/java/home}
46
+ else
47
+ jruby_launcher_args("-Xjdkhome some/java/home").first.should == File.join("some", "java", "home", "bin", "java")
48
+ end
49
+ end
50
+ end
51
+
52
+ it "should drop the backslashes at the end of JAVA_HOME" do
53
+ with_environment "JAVA_HOME" => File.join("some", "java", "home\\\\") do
54
+ if windows?
55
+ jruby_launcher_args("").join.should =~ %r{some/java/home}
56
+ else
57
+ jruby_launcher_args("").first.should == File.join("some", "java", "home", "bin", "java")
58
+ end
59
+ end
60
+ end
61
+
62
+ it "should complain about a missing log argument" do
63
+ jruby_launcher("-Xtrace 2>&1").should =~ /Argument is missing for "-Xtrace"/
64
+ jruby_launcher("-Xtrace -- 2>&1").should =~ /Argument is missing for "-Xtrace"/
65
+ end
66
+
67
+ it "should complain about a missing jdkhome argument" do
68
+ jruby_launcher("-Xjdkhome 2>&1").should =~ /Argument is missing/
69
+ jruby_launcher("-Xjdkhome -- 2>&1").should =~ /Argument is missing/
70
+ end
71
+
72
+ it "should complain about a missing classpath append argument" do
73
+ jruby_launcher("-Xcp:a 2>&1").should =~ /Argument is missing/
74
+ jruby_launcher("-Xcp:a -- 2>&1").should =~ /Argument is missing/
75
+ end
76
+
77
+ it "should run nailgun server with --ng-server option" do
78
+ jruby_launcher_args("--ng-server").last.should == "com/martiansoftware/nailgun/NGServer"
79
+ end
80
+
81
+ it "should run nailgun client with --ng option" do
82
+ jruby_launcher_args('--ng -e "puts 1"').should == ["org.jruby.util.NailMain", "-e", "puts 1"]
83
+ end
84
+
85
+ it "should handle -J JVM options" do
86
+ jruby_launcher_args("-J-Darg1=value1 -J-Darg2=value2").should include("-Darg1=value1", "-Darg2=value2")
87
+ end
88
+
89
+ it "should pass -Xprop.erty=value as -J-Djruby.prop.erty=value" do
90
+ jruby_launcher_args("-Xprop.erty=value").should include("-Djruby.prop.erty=value")
91
+ end
92
+
93
+ it "should pass -Xproperties as --properties" do
94
+ jruby_launcher_args("-Xproperties").should include("--properties")
95
+ end
96
+
97
+ it "should default to 500m max heap" do
98
+ jruby_launcher_args("").should include("-Xmx500m")
99
+ end
100
+
101
+ it "should allow max heap to be overridden" do
102
+ jruby_launcher_args("-J-Xmx256m").should include("-Xmx256m")
103
+ end
104
+
105
+ it "should default to 2048k max stack" do
106
+ jruby_launcher_args("").should include("-Xss2048k")
107
+ end
108
+
109
+ it "should allow max stack to be overridden" do
110
+ jruby_launcher_args("-J-Xss512k").should include("-Xss512k")
111
+ end
112
+
113
+ it "should add the contents of the CLASSPATH environment variable" do
114
+ with_environment "CLASSPATH" => "some.jar" do
115
+ classpath_arg(jruby_launcher_args("")).should =~ /some.jar/
116
+ end
117
+ end
118
+
119
+ it "should add the classpath elements in proper order" do
120
+ s = File::PATH_SEPARATOR
121
+ with_environment "CLASSPATH" => "some-env.jar" do
122
+ args = jruby_launcher_args("-Xcp:a some-other.jar -Xcp:p some.jar")
123
+ classpath_arg(args).should =~ /some.jar.*#{s}some-env.jar#{s}some-other.jar/
124
+ end
125
+ end
126
+
127
+ it "should use the --server compiler" do
128
+ jruby_launcher_args("--server").should include("-server")
129
+ end
130
+
131
+ it "should use the --client compiler" do
132
+ jruby_launcher_args("--client").should include("-client")
133
+ end
134
+
135
+ it "should set the JMX settings when --manage is present" do
136
+ jruby_launcher_args("--manage").should include("-Dcom.sun.management.jmxremote", "-Djruby.management.enabled=true")
137
+ end
138
+
139
+ it "should set the headless flag when --headless is present" do
140
+ jruby_launcher_args("--headless").should include("-Djava.awt.headless=true")
141
+ end
142
+
143
+ it "should pass -Xprof when --sample is present" do
144
+ jruby_launcher_args("--sample").should include("-Xprof")
145
+ end
146
+
147
+ it "should stop argument processing when a -- is seen" do
148
+ jruby_launcher_args("-- -Xhelp -Xtrace --headless").should include("-Xhelp", "-Xtrace", "--headless")
149
+ end
150
+
151
+ # JRUBY-4151
152
+ it "should properly handle single quotes" do
153
+ jruby_launcher_args("-e 'ABC DEF'").should include("ABC DEF")
154
+ end
155
+
156
+ # JRUBY-4581
157
+ it "should prepend JRUBY_OPTS to the start of the argument list to process" do
158
+ with_environment "JRUBY_OPTS" => "--server -J-Dsome.key=val -rubygems" do
159
+ jruby_launcher_args("-e 'ABC DEF'").should include("-server", "-Dsome.key=val", "-rubygems", "-e", "ABC DEF")
160
+ end
161
+ end
162
+
163
+ # JRUBY-4611
164
+ it "stops argument processing on first non-option argument" do
165
+ jruby_launcher_args("foo.rb --sample")[-2..-1].should == ["foo.rb", "--sample"]
166
+ end
167
+
168
+ # JRUBY-4608
169
+ if RbConfig::CONFIG['target_os'] =~ /darwin/i
170
+ it "includes file.encoding=UTF-8 on Mac if JAVA_ENCODING is not set" do
171
+ jruby_launcher_args("-e true").should include("-Dfile.encoding=UTF-8")
172
+ with_environment "JAVA_ENCODING" => "MacRoman" do
173
+ jruby_launcher_args("-e true").should_not include("-Dfile.encoding=UTF-8")
174
+ end
175
+ end
176
+ end
177
+
178
+ it "does not crash on empty args" do
179
+ jruby_launcher_args("-e ''").should include("-e")
180
+ jruby_launcher("-Xtrace '' 2>&1").should =~ /-Xtrace/
181
+ jruby_launcher("-Xjdkhome '' 2>&1").should =~ /-Xjdkhome/
182
+ end
183
+
184
+ # JRUBY-4706
185
+ it "should put JRuby on regular classpath when -Xnobootclasspath is used" do
186
+ args = jruby_launcher_args("-e true")
187
+ args.grep(/Xbootclasspath/).should_not be_empty
188
+ args = jruby_launcher_args("-Xnobootclasspath -e true")
189
+ args.grep(/Xbootclasspath/).should be_empty
190
+ end
191
+
192
+ it "should put JRuby on regular classpath when VERIFY_JRUBY is set" do
193
+ with_environment "VERIFY_JRUBY" => "true" do
194
+ args = jruby_launcher_args("-e true")
195
+ args.grep(/Xbootclasspath/).should be_empty
196
+ end
197
+ end
198
+
199
+ # JRUBY-4709
200
+ it "should include a bare : or ; at the end of the classpath, to include PWD in the path" do
201
+ classpath_arg(jruby_launcher_args("-Xnobootclasspath -e true")).should =~
202
+ if windows?
203
+ /;$/
204
+ else
205
+ /:$/
206
+ end
207
+ end
208
+
209
+ # JRUBY-6016
210
+ it "should honor JAVA_MEM" do
211
+ with_environment "JAVA_MEM" => "-Xmx768m" do
212
+ jruby_launcher_args("").should include("-Xmx768m")
213
+ end
214
+ end
215
+
216
+ it "should honor JAVA_STACK" do
217
+ with_environment "JAVA_STACK" => "-Xss3072k" do
218
+ jruby_launcher_args("").should include("-Xss3072k")
219
+ end
220
+ end
221
+
222
+ it "should honor JRUBY_HOME" do
223
+ with_environment "JRUBY_HOME" => "/tmp" do
224
+ jruby_launcher_args("").should include("-Djruby.home=/tmp")
225
+ end
226
+ end
227
+
228
+ context "JRUBY_HOME set and JRUBY_HOME/lib/jruby.jar exists" do
229
+ let(:jruby_home) do
230
+ require 'tempfile'
231
+ t = Tempfile.new("jruby_home")
232
+ t.path.tap { t.close! }
233
+ end
234
+
235
+ before do
236
+ FileUtils.mkdir_p(File.join(jruby_home, "lib"))
237
+ FileUtils.touch(File.join(jruby_home, "lib", "jruby.jar"))
238
+ end
239
+ after { FileUtils.rm_rf jruby_home }
240
+
241
+ it "should add jruby.jar to the bootclasspath" do
242
+ with_environment "JRUBY_HOME" => jruby_home do
243
+ jruby_launcher_args("").should include("-Xbootclasspath/a:#{jruby_home}/lib/jruby.jar")
244
+ end
245
+ end
246
+ end
247
+
248
+ it "should place user-supplied options after default options" do
249
+ args = jruby_launcher_args("-J-Djruby.home=/tmp")
250
+ home_args = args.select {|x| x =~ /^-Djruby\.home/ }
251
+ home_args.length.should == 2
252
+ home_args.last.should == "-Djruby.home=/tmp"
253
+ end
254
+
255
+ it "should print the version" do
256
+ jruby_launcher("-Xversion 2>&1").should =~ /Launcher Version #{JRubyLauncher::VERSION}/
257
+ end
258
+
259
+ it "should not crash on format-strings" do
260
+ jruby_launcher_args("-e %s%s%s%s%s 2>&1").should include('-e', '%s%s%s%s%s')
261
+ end
262
+ end
@@ -0,0 +1,81 @@
1
+ require 'rspec'
2
+ require 'rbconfig'
3
+ require 'fileutils'
4
+
5
+ if defined?(JRUBY_VERSION)
6
+ require 'jruby'
7
+ JRuby.runtime.instance_config.run_ruby_in_process = false
8
+ end
9
+
10
+ module JRubyLauncherHelper
11
+ JRUBY_EXE = ''
12
+ WINDOWS = RbConfig::CONFIG['target_os'] =~ /mswin/
13
+
14
+ def self.check_executable_built
15
+ exe = File.expand_path("../../jruby", __FILE__) + RbConfig::CONFIG['EXEEXT']
16
+ unless File.executable?(exe)
17
+ raise "Error: launcher executable not built; type `make' before continuing."
18
+ end
19
+ top = File.dirname(exe)
20
+ name = File.basename(exe)
21
+ home = File.join(top, "build/home")
22
+ FileUtils.mkdir_p(File.join(home, "bin"))
23
+ FileUtils.cp(exe, File.join(home, "bin"))
24
+ if JRubyLauncherHelper::WINDOWS
25
+ FileUtils.cp(exe.sub(/exe/, 'dll'), File.join(home, "bin"))
26
+ end
27
+ FileUtils.mkdir_p(File.join(home, "lib"))
28
+ FileUtils.touch(File.join(home, "lib/jruby.jar"))
29
+ JRUBY_EXE.concat File.join(home, "bin", name)
30
+ end
31
+
32
+ def jruby_launcher(args)
33
+ `#{JRUBY_EXE} #{args}`
34
+ end
35
+
36
+ def jruby_launcher_args(args)
37
+ jruby_launcher("-Xcommand #{args}").split("\n")
38
+ end
39
+
40
+ def last_exit_code
41
+ $?.exitstatus
42
+ end
43
+
44
+ def windows?
45
+ WINDOWS
46
+ end
47
+
48
+ def classpath_arg(args)
49
+ index = args.index("-cp")
50
+ index.should > 0
51
+ args[index + 1]
52
+ end
53
+
54
+ def with_environment(pairs = {})
55
+ prev_env = {}
56
+ pairs.each_pair do |k,v|
57
+ prev_env[k] = ENV[k] if ENV.has_key?(k)
58
+ ENV[k] = v
59
+ end
60
+ begin
61
+ yield
62
+ ensure
63
+ pairs.keys.each {|k| ENV.delete(k)}
64
+ ENV.update(prev_env)
65
+ end
66
+ end
67
+ end
68
+
69
+ RSpec.configure do |config|
70
+ config.before(:all) do
71
+ JRubyLauncherHelper.check_executable_built
72
+ # clear environment for better control
73
+ ENV.delete("JAVA_HOME")
74
+ ENV.delete("JRUBY_HOME")
75
+ ENV.delete("JAVA_OPTS")
76
+ ENV.delete("JRUBY_OPTS")
77
+ ENV.delete("CLASSPATH")
78
+ ENV.delete("JAVA_ENCODING")
79
+ end
80
+ config.include(JRubyLauncherHelper)
81
+ end
data/platformlauncher.cpp CHANGED
@@ -1,252 +1,252 @@
1
- /*
2
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
- *
4
- * Copyright 2009-2012 JRuby Team (www.jruby.org).
5
- * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved.
6
- *
7
- * The contents of this file are subject to the terms of either the GNU
8
- * General Public License Version 2 only ("GPL") or the Common
9
- * Development and Distribution License("CDDL") (collectively, the
10
- * "License"). You may not use this file except in compliance with the
11
- * License. You can obtain a copy of the License at
12
- * http://www.netbeans.org/cddl-gplv2.html
13
- * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
14
- * specific language governing permissions and limitations under the
15
- * License. When distributing the software, include this License Header
16
- * Notice in each file and include the License file at
17
- * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
18
- * particular file as subject to the "Classpath" exception as provided
19
- * by Sun in the GPL Version 2 section of the License file that
20
- * accompanied this code. If applicable, add the following below the
21
- * License Header, with the fields enclosed by brackets [] replaced by
22
- * your own identifying information:
23
- * "Portions Copyrighted [year] [name of copyright owner]"
24
- *
25
- * Contributor(s):
26
- *
27
- * The Original Software is NetBeans. The Initial Developer of the Original
28
- * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun
29
- * Microsystems, Inc. All Rights Reserved.
30
- *
31
- * If you wish your version of this file to be governed by only the CDDL
32
- * or only the GPL Version 2, indicate your decision by adding
33
- * "[Contributor] elects to include this software in this distribution
34
- * under the [CDDL or GPL Version 2] license." If you do not indicate a
35
- * single choice of license, a recipient has the option to distribute
36
- * your version of this file under either the CDDL, the GPL Version 2 or
37
- * to extend the choice of license to its licensees as provided above.
38
- * However, if you add GPL Version 2 code and therefore, elected the GPL
39
- * Version 2 license, then the option applies only if the new code is
40
- * made subject to such option by the copyright holder.
41
- *
42
- * Author: Tomas Holy
43
- */
44
-
45
- #include <stdio.h>
46
- #include "utilsfuncs.h"
47
- #include "platformlauncher.h"
48
- #include "rb_w32_cmdvector.h"
49
-
50
- using namespace std;
51
-
52
- extern "C" int nailgunClientMain(int argc, char *argv[], char *env[]);
53
-
54
- PlatformLauncher::PlatformLauncher()
55
- : ArgParser()
56
- , suppressConsole(false)
57
- {
58
- separateProcess = false;
59
- }
60
-
61
- PlatformLauncher::PlatformLauncher(const PlatformLauncher& orig)
62
- : ArgParser(orig)
63
- {
64
- }
65
-
66
- PlatformLauncher::~PlatformLauncher() {
67
- }
68
-
69
- list<string>* GetEnvStringsAsList() {
70
- char * env = GetEnvironmentStrings();
71
- list<string> * envList = new list<string>();
72
- while (*env) {
73
- envList->push_back(env);
74
- env = env + strlen(env) + 1;
75
- }
76
- return envList;
77
- }
78
-
79
- bool PlatformLauncher::start(char* argv[], int argc, DWORD *retCode, const char* binaryName) {
80
-
81
- // subvert cmd.exe's feeble attempt at command line parsing,
82
- // the code is taken from MRI
83
- argc = rb_w32_cmdvector(GetCommandLine(), &argv);
84
-
85
- // remove the first argument ('jruby')
86
- argc -= 1;
87
- argv += 1;
88
-
89
- platformDir = binaryName;
90
- checkLoggingArg(argc, argv, false);
91
- if (!initPlatformDir()
92
- || !parseArgs(argc, argv)
93
- || !checkJDKHome()) {
94
- return false;
95
- }
96
- disableFolderVirtualization(GetCurrentProcess());
97
-
98
- if (nailgunClient) {
99
- progArgs.push_front("org.jruby.util.NailMain");
100
- char ** nailArgv = convertToArgvArray(progArgs);
101
- if (printCommandLine) {
102
- printListToConsole(progArgs);
103
- return true;
104
- }
105
-
106
- list<string>* envList = GetEnvStringsAsList();
107
- char ** nailEnv = convertToArgvArray(*envList);
108
- nailgunClientMain(progArgs.size(), nailArgv, nailEnv);
109
- return true;
110
- }
111
-
112
- if (binaryName) {
113
- // clean up the binaryName first,
114
- // remove '.exe' from the end, and the possible path.
115
- string bn = binaryName;
116
-
117
- size_t found = bn.find_last_of("/\\");
118
- if (found != string::npos) {
119
- logMsg("The binary name contains slashes, will remove: %s", binaryName);
120
- bn = bn.substr(found + 1);
121
- binaryName = bn.c_str();
122
- }
123
-
124
- found = bn.find(".exe", bn.length() - 4);
125
- if (found != string::npos) {
126
- bn.erase(found, 4);
127
- binaryName = bn.c_str();
128
- logMsg("*** Cleaned up the binary name: %s", binaryName);
129
- } else {
130
- logMsg("*** No need to clean the binary name: %s", binaryName);
131
- }
132
-
133
- if (strnicmp(binaryName, DEFAULT_EXECUTABLE, strlen(DEFAULT_EXECUTABLE)) != 0) {
134
- logMsg("PlatformLauncher:\n\tNon-default executable name: %s", binaryName);
135
- logMsg("\tHence, launching with extra parameters: -S %s", binaryName);
136
- progArgs.push_front(binaryName);
137
- progArgs.push_front("-S");
138
- }
139
- }
140
-
141
- prepareOptions();
142
-
143
- string java("");
144
-
145
- if (getenv("JAVACMD") != NULL) {
146
- java = getenv("JAVACMD");
147
- jvmLauncher.setJavaCmd(java);
148
- separateProcess = true;
149
- suppressConsole = false;
150
- } else {
151
- if (jdkhome.empty()) {
152
- if (!jvmLauncher.initialize(REQ_JAVA_VERSION)) {
153
- logErr(false, true, "Cannot find Java %s or higher.", REQ_JAVA_VERSION);
154
- return false;
155
- }
156
- }
157
-
158
- jvmLauncher.getJavaPath(jdkhome);
159
- java = jdkhome + "\\bin\\java";
160
- }
161
-
162
- if (printCommandLine) {
163
- list<string> commandLine;
164
- commandLine.push_back(java);
165
- addOptionsToCommandLine(commandLine);
166
- for (list<string>::iterator it = commandLine.begin(); it != commandLine.end(); it++) {
167
- printf("%s\n", it->c_str());
168
- }
169
- return true;
170
- }
171
-
172
- if (nextAction.empty()) {
173
- while (true) {
174
- // run app
175
- if (!run(retCode)) {
176
- return false;
177
- }
178
-
179
- break;
180
- }
181
- } else {
182
- logErr(false, true, "We should not get here.");
183
- return false;
184
- }
185
-
186
- return true;
187
- }
188
-
189
- bool PlatformLauncher::run(DWORD *retCode) {
190
- logMsg("Starting application...");
191
-
192
- jvmLauncher.setSuppressConsole(suppressConsole);
193
-
194
- bool rc = jvmLauncher.start(bootclass.c_str(), progArgs, javaOptions, separateProcess, retCode);
195
- if (!separateProcess) {
196
- exit(0);
197
- }
198
- return rc;
199
- }
200
-
201
- bool PlatformLauncher::checkJDKHome() {
202
- if (!jdkhome.empty() && !jvmLauncher.initialize(jdkhome.c_str())) {
203
- logMsg("Cannot locate java installation in specified jdkhome: %s", jdkhome.c_str());
204
- string errMsg = "ERROR: Cannot locate Java installation in specified jdkhome:\n";
205
- errMsg += jdkhome;
206
- string errMsgFull = errMsg + "\nDo you want to try to use default version?";
207
- jdkhome = "";
208
- // Pop-up the message box only if there is no console
209
- if (!isConsoleAttached()) {
210
- if (::MessageBox(NULL, errMsgFull.c_str(), "Invalid jdkhome specified", MB_ICONQUESTION | MB_YESNO) == IDNO) {
211
- return false;
212
- }
213
- } else {
214
- fprintf(stdout, "%s\n", errMsg.c_str());
215
- return false;
216
- }
217
- }
218
-
219
- if (jdkhome.empty()) {
220
- logMsg("-Xjdkhome is not set, checking for %%JAVA_HOME%%...");
221
- char *origJavaHome = getenv("JAVA_HOME");
222
- if (origJavaHome) {
223
- string javaHome = trimTrailingBackslashes(origJavaHome);
224
- logMsg("%%JAVA_HOME%% is set: %s", javaHome.c_str());
225
- if (!jvmLauncher.initialize(javaHome.c_str())) {
226
- logMsg("ERROR: Cannot locate java installation, specified by JAVA_HOME: %s", javaHome.c_str());
227
- string errMsg = "Cannot locate Java installation, specified by JAVA_HOME:\n";
228
- errMsg += javaHome;
229
- string errMsgFull = errMsg + "\nDo you want to try to use default version?";
230
- jdkhome = "";
231
- // Pop-up the message box only if there is no console
232
- if (!isConsoleAttached()) {
233
- if (::MessageBox(NULL, errMsgFull.c_str(),
234
- "Invalid jdkhome specified", MB_ICONQUESTION | MB_YESNO) == IDNO) {
235
- return false;
236
- }
237
- } else {
238
- fprintf(stdout, "%s\n", errMsg.c_str());
239
- return false;
240
- }
241
- } else {
242
- jdkhome = javaHome;
243
- }
244
- }
245
- }
246
-
247
- return true;
248
- }
249
-
250
- void PlatformLauncher::onExit() {
251
- logMsg("onExit()");
252
- }
1
+ /*
2
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
+ *
4
+ * Copyright 2009-2012 JRuby Team (www.jruby.org).
5
+ * Copyright 1997-2008 Sun Microsystems, Inc. All rights reserved.
6
+ *
7
+ * The contents of this file are subject to the terms of either the GNU
8
+ * General Public License Version 2 only ("GPL") or the Common
9
+ * Development and Distribution License("CDDL") (collectively, the
10
+ * "License"). You may not use this file except in compliance with the
11
+ * License. You can obtain a copy of the License at
12
+ * http://www.netbeans.org/cddl-gplv2.html
13
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
14
+ * specific language governing permissions and limitations under the
15
+ * License. When distributing the software, include this License Header
16
+ * Notice in each file and include the License file at
17
+ * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
18
+ * particular file as subject to the "Classpath" exception as provided
19
+ * by Sun in the GPL Version 2 section of the License file that
20
+ * accompanied this code. If applicable, add the following below the
21
+ * License Header, with the fields enclosed by brackets [] replaced by
22
+ * your own identifying information:
23
+ * "Portions Copyrighted [year] [name of copyright owner]"
24
+ *
25
+ * Contributor(s):
26
+ *
27
+ * The Original Software is NetBeans. The Initial Developer of the Original
28
+ * Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun
29
+ * Microsystems, Inc. All Rights Reserved.
30
+ *
31
+ * If you wish your version of this file to be governed by only the CDDL
32
+ * or only the GPL Version 2, indicate your decision by adding
33
+ * "[Contributor] elects to include this software in this distribution
34
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
35
+ * single choice of license, a recipient has the option to distribute
36
+ * your version of this file under either the CDDL, the GPL Version 2 or
37
+ * to extend the choice of license to its licensees as provided above.
38
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
39
+ * Version 2 license, then the option applies only if the new code is
40
+ * made subject to such option by the copyright holder.
41
+ *
42
+ * Author: Tomas Holy
43
+ */
44
+
45
+ #include <stdio.h>
46
+ #include "utilsfuncs.h"
47
+ #include "platformlauncher.h"
48
+ #include "rb_w32_cmdvector.h"
49
+
50
+ using namespace std;
51
+
52
+ extern "C" int nailgunClientMain(int argc, char *argv[], char *env[]);
53
+
54
+ PlatformLauncher::PlatformLauncher()
55
+ : ArgParser()
56
+ , suppressConsole(false)
57
+ {
58
+ separateProcess = false;
59
+ }
60
+
61
+ PlatformLauncher::PlatformLauncher(const PlatformLauncher& orig)
62
+ : ArgParser(orig)
63
+ {
64
+ }
65
+
66
+ PlatformLauncher::~PlatformLauncher() {
67
+ }
68
+
69
+ list<string>* GetEnvStringsAsList() {
70
+ char * env = GetEnvironmentStrings();
71
+ list<string> * envList = new list<string>();
72
+ while (*env) {
73
+ envList->push_back(env);
74
+ env = env + strlen(env) + 1;
75
+ }
76
+ return envList;
77
+ }
78
+
79
+ bool PlatformLauncher::start(char* argv[], int argc, DWORD *retCode, const char* binaryName) {
80
+
81
+ // subvert cmd.exe's feeble attempt at command line parsing,
82
+ // the code is taken from MRI
83
+ argc = rb_w32_cmdvector(GetCommandLine(), &argv);
84
+
85
+ // remove the first argument ('jruby')
86
+ argc -= 1;
87
+ argv += 1;
88
+
89
+ platformDir = binaryName;
90
+ checkLoggingArg(argc, argv, false);
91
+ if (!initPlatformDir()
92
+ || !parseArgs(argc, argv)
93
+ || !checkJDKHome()) {
94
+ return false;
95
+ }
96
+ disableFolderVirtualization(GetCurrentProcess());
97
+
98
+ if (nailgunClient) {
99
+ progArgs.push_front("org.jruby.util.NailMain");
100
+ char ** nailArgv = convertToArgvArray(progArgs);
101
+ if (printCommandLine) {
102
+ printListToConsole(progArgs);
103
+ return true;
104
+ }
105
+
106
+ list<string>* envList = GetEnvStringsAsList();
107
+ char ** nailEnv = convertToArgvArray(*envList);
108
+ nailgunClientMain(progArgs.size(), nailArgv, nailEnv);
109
+ return true;
110
+ }
111
+
112
+ if (binaryName) {
113
+ // clean up the binaryName first,
114
+ // remove '.exe' from the end, and the possible path.
115
+ string bn = binaryName;
116
+
117
+ size_t found = bn.find_last_of("/\\");
118
+ if (found != string::npos) {
119
+ logMsg("The binary name contains slashes, will remove: %s", binaryName);
120
+ bn = bn.substr(found + 1);
121
+ binaryName = bn.c_str();
122
+ }
123
+
124
+ found = bn.find(".exe", bn.length() - 4);
125
+ if (found != string::npos) {
126
+ bn.erase(found, 4);
127
+ binaryName = bn.c_str();
128
+ logMsg("*** Cleaned up the binary name: %s", binaryName);
129
+ } else {
130
+ logMsg("*** No need to clean the binary name: %s", binaryName);
131
+ }
132
+
133
+ if (strnicmp(binaryName, DEFAULT_EXECUTABLE, strlen(DEFAULT_EXECUTABLE)) != 0) {
134
+ logMsg("PlatformLauncher:\n\tNon-default executable name: %s", binaryName);
135
+ logMsg("\tHence, launching with extra parameters: -S %s", binaryName);
136
+ progArgs.push_front(binaryName);
137
+ progArgs.push_front("-S");
138
+ }
139
+ }
140
+
141
+ prepareOptions();
142
+
143
+ string java("");
144
+
145
+ if (getenv("JAVACMD") != NULL) {
146
+ java = getenv("JAVACMD");
147
+ jvmLauncher.setJavaCmd(java);
148
+ separateProcess = true;
149
+ suppressConsole = false;
150
+ } else {
151
+ if (jdkhome.empty()) {
152
+ if (!jvmLauncher.initialize(REQ_JAVA_VERSION)) {
153
+ logErr(false, true, "Cannot find Java %s or higher.", REQ_JAVA_VERSION);
154
+ return false;
155
+ }
156
+ }
157
+
158
+ jvmLauncher.getJavaPath(jdkhome);
159
+ java = jdkhome + "\\bin\\java";
160
+ }
161
+
162
+ if (printCommandLine) {
163
+ list<string> commandLine;
164
+ commandLine.push_back(java);
165
+ addOptionsToCommandLine(commandLine);
166
+ for (list<string>::iterator it = commandLine.begin(); it != commandLine.end(); it++) {
167
+ printf("%s\n", it->c_str());
168
+ }
169
+ return true;
170
+ }
171
+
172
+ if (nextAction.empty()) {
173
+ while (true) {
174
+ // run app
175
+ if (!run(retCode)) {
176
+ return false;
177
+ }
178
+
179
+ break;
180
+ }
181
+ } else {
182
+ logErr(false, true, "We should not get here.");
183
+ return false;
184
+ }
185
+
186
+ return true;
187
+ }
188
+
189
+ bool PlatformLauncher::run(DWORD *retCode) {
190
+ logMsg("Starting application...");
191
+
192
+ jvmLauncher.setSuppressConsole(suppressConsole);
193
+
194
+ bool rc = jvmLauncher.start(bootclass.c_str(), progArgs, javaOptions, separateProcess, retCode);
195
+ if (!separateProcess) {
196
+ exit(0);
197
+ }
198
+ return rc;
199
+ }
200
+
201
+ bool PlatformLauncher::checkJDKHome() {
202
+ if (!jdkhome.empty() && !jvmLauncher.initialize(jdkhome.c_str())) {
203
+ logMsg("Cannot locate java installation in specified jdkhome: %s", jdkhome.c_str());
204
+ string errMsg = "ERROR: Cannot locate Java installation in specified jdkhome:\n";
205
+ errMsg += jdkhome;
206
+ string errMsgFull = errMsg + "\nDo you want to try to use default version?";
207
+ jdkhome = "";
208
+ // Pop-up the message box only if there is no console
209
+ if (!isConsoleAttached()) {
210
+ if (::MessageBox(NULL, errMsgFull.c_str(), "Invalid jdkhome specified", MB_ICONQUESTION | MB_YESNO) == IDNO) {
211
+ return false;
212
+ }
213
+ } else {
214
+ fprintf(stdout, "%s\n", errMsg.c_str());
215
+ return false;
216
+ }
217
+ }
218
+
219
+ if (jdkhome.empty()) {
220
+ logMsg("-Xjdkhome is not set, checking for %%JAVA_HOME%%...");
221
+ char *origJavaHome = getenv("JAVA_HOME");
222
+ if (origJavaHome) {
223
+ string javaHome = trimTrailingBackslashes(origJavaHome);
224
+ logMsg("%%JAVA_HOME%% is set: %s", javaHome.c_str());
225
+ if (!jvmLauncher.initialize(javaHome.c_str())) {
226
+ logMsg("ERROR: Cannot locate java installation, specified by JAVA_HOME: %s", javaHome.c_str());
227
+ string errMsg = "Cannot locate Java installation, specified by JAVA_HOME:\n";
228
+ errMsg += javaHome;
229
+ string errMsgFull = errMsg + "\nDo you want to try to use default version?";
230
+ jdkhome = "";
231
+ // Pop-up the message box only if there is no console
232
+ if (!isConsoleAttached()) {
233
+ if (::MessageBox(NULL, errMsgFull.c_str(),
234
+ "Invalid jdkhome specified", MB_ICONQUESTION | MB_YESNO) == IDNO) {
235
+ return false;
236
+ }
237
+ } else {
238
+ fprintf(stdout, "%s\n", errMsg.c_str());
239
+ return false;
240
+ }
241
+ } else {
242
+ jdkhome = javaHome;
243
+ }
244
+ }
245
+ }
246
+
247
+ return true;
248
+ }
249
+
250
+ void PlatformLauncher::onExit() {
251
+ logMsg("onExit()");
252
+ }