-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
Get-Java.ps1
221 lines (187 loc) · 7.84 KB
/
Get-Java.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# Copyright (c) 2002-2015 "Neo Technology,"
# Network Engine for Objects in Lund AB [http://neotechnology.com]
#
# This file is part of Neo4j.
#
# Neo4j is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
<#
.SYNOPSIS
Retrieves information about Java on the local machine to start Neo4j programs
.DESCRIPTION
Retrieves information about Java on the local machine to start Neo4j services and utilites, tailored to the type of Neo4j edition
.PARAMETER Neo4jServer
The Neo4j Server Object
.PARAMETER ForServer
Retrieve the Java command line to start a Neo4j Server
.PARAMETER ForArbiter
Retrieve the Java command line to start a Neo4j Arbiter
.PARAMETER ForUtility
Retrieve the Java command line to start a Neo4j utility such as Neo4j Shell.
.PARAMETER AppName
Application name used when invoking Java
.PARAMETER StartingClass
The name of the starting class when invoking Java
.EXAMPLE
Get-Java -Neo4jServer $serverObject -ForServer
Retrieves the Java comamnd line to start the Neo4j server for the instance in $serverObject.
.OUTPUTS
System.Collections.Hashtable
.NOTES
This function is private to the powershell module
#>
Function Get-Java
{
[cmdletBinding(SupportsShouldProcess=$false,ConfirmImpact='Low',DefaultParameterSetName='Default')]
param (
[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='UtilityInvoke')]
[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='ServerInvoke')]
[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='ArbiterInvoke')]
[PSCustomObject]$Neo4jServer
,[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='ServerInvoke')]
[switch]$ForServer
,[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='ArbiterInvoke')]
[switch]$ForArbiter
,[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='UtilityInvoke')]
[switch]$ForUtility
,[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='UtilityInvoke')]
[string]$AppName
,[Parameter(Mandatory=$true,ValueFromPipeline=$false,ParameterSetName='UtilityInvoke')]
[string]$StartingClass
)
Begin
{
}
Process
{
$javaPath = ''
$javaVersion = ''
$javaCMD = ''
# Is JAVA specified in an environment variable
if (($javaPath -eq '') -and ($Env:JAVA_HOME -ne $null))
{
$javaPath = $Env:JAVA_HOME
if (Test-Path -Path "$javaPath\bin\javac.exe") { $javaPath = "$javaPath\jre" }
}
# Attempt to find Java in registry
$regKey = 'Registry::HKLM\SOFTWARE\JavaSoft\Java Runtime Environment'
if (($javaPath -eq '') -and (Test-Path -Path $regKey))
{
$javaVersion = ''
try
{
$javaVersion = [string](Get-ItemProperty -Path $regKey -ErrorAction 'Stop').CurrentVersion
if ($javaVersion -ne '')
{
$javaPath = [string](Get-ItemProperty -Path "$regKey\$javaVersion" -ErrorAction 'Stop').JavaHome
}
}
catch
{
#Ignore any errors
$javaVersion = ''
$javaPath = ''
}
}
# Attempt to find Java in registry (32bit Java on 64bit OS)
$regKey = 'Registry::HKLM\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment'
if (($javaPath -eq '') -and (Test-Path -Path $regKey))
{
$javaVersion = ''
try
{
$javaVersion = [string](Get-ItemProperty -Path $regKey -ErrorAction 'Stop').CurrentVersion
if ($javaVersion -ne '')
{
$javaPath = [string](Get-ItemProperty -Path "$regKey\$javaVersion" -ErrorAction 'Stop').JavaHome
}
}
catch
{
#Ignore any errors
$javaVersion = ''
$javaPath = ''
}
}
# Attempt to find Java in the search path
if ($javaPath -eq '')
{
$javaExe = (Get-Command 'java.exe' -ErrorAction SilentlyContinue)
if ($javaExe -ne $null)
{
$javaCMD = $javaExe.Path
$javaPath = Split-Path -Path $javaCMD -Parent
}
}
if ($javaVersion -eq '') { Write-Verbose 'Unable to determine Java version' }
if ($javaPath -eq '') { Write-Error "Unable to determine the path to java.exe"; return $null }
if ($javaCMD -eq '') { $javaCMD = "$javaPath\bin\java.exe" }
if (-not (Test-Path -Path $javaCMD)) { Write-Error "Could not find java at $javaCMD"; return $null }
$ShellArgs = @()
# Shell arguments for the Neo4jServer and Arbiter classes
if (($PsCmdlet.ParameterSetName -eq 'ServerInvoke') -or ($PsCmdlet.ParameterSetName -eq 'ArbiterInvoke') )
{
if ($PsCmdlet.ParameterSetName -eq 'ServerInvoke')
{
$serverMainClass = ''
# Server Class Path for version 2.3 and above
if ($Neo4jServer.ServerType -eq 'Advanced') { $serverMainClass = 'org.neo4j.server.advanced.AdvancedBootstrapper' }
if ($Neo4jServer.ServerType -eq 'Enterprise') { $serverMainClass = 'org.neo4j.server.enterprise.EnterpriseBootstrapper' }
if ($Neo4jServer.ServerType -eq 'Community') { $serverMainClass = 'org.neo4j.server.CommunityBootstrapper' }
# Server Class Path for version 2.2 and below
if ($Neo4jServer.ServerVersion -match '^(2\.2|2\.1|2\.0|1\.)')
{
$serverMainClass = 'org.neo4j.server.Bootstrapper'
}
if ($serverMainClass -eq '') { Write-Error "Unable to determine the Server Main Class from the server information"; return $null }
$wrapperConfig = 'neo4j-wrapper.conf'
}
if ($PsCmdlet.ParameterSetName -eq 'ArbiterInvoke')
{
$serverMainClass = 'org.neo4j.server.enterprise.StandaloneClusterClient'
$wrapperConfig = 'arbiter-wrapper.conf'
}
# Note -DserverMainClass must appear before -jar in the argument list. Changing this order raises a Null Pointer Exception in the Windows Service Wrapper
$ShellArgs = @( `
"-DworkingDir=`"$($Neo4jServer.Home)`"" `
,"-Djava.util.logging.config.file=`"$($Neo4jServer.Home)\conf\windows-wrapper-logging.properties`"" `
,"-DconfigFile=`"conf/$($wrapperConfig)`"" `
,"-DserverClasspath=`"lib/*.jar;system/lib/*.jar;plugins/**/*.jar;./conf*`"" `
,"-DserverMainClass=$($serverMainClass)" `
,"-jar","`"$($Neo4jServer.Home)\bin\windows-service-wrapper-5.jar`""
)
}
# Shell arguments for the utility classes e.g. Import, Shell
if ($PsCmdlet.ParameterSetName -eq 'UtilityInvoke')
{
# Get the commandline args
$RepoPath = Join-Path -Path $Neo4jServer.Home -ChildPath 'lib'
# Get the default classpath jars
$ClassPath = ''
Get-ChildItem -Path $RepoPath | Where-Object { $_.Extension -eq '.jar'} | % {
$ClassPath += "`"$($_.FullName)`";"
}
if ($ClassPath.Length -gt 0) { $ClassPath = $ClassPath.SubString(0, $ClassPath.Length-1) } # Strip the trailing semicolon if needed
$ShellArgs = @()
if ($Env:JAVA_OPTS -ne $null) { $ShellArgs += $Env:JAVA_OPTS }
if ($Env:EXTRA_JVM_ARGUMENTS -ne $null) { $ShellArgs += $Env:EXTRA_JVM_ARGUMENTS }
$ShellArgs += @("-classpath $($Env:CLASSPATH_PREFIX);$ClassPath","-Dapp.repo=`"$($RepoPath)`"","-Dbasedir=`"$($Neo4jServer.Home)`"")
# Add the appname and starting class
$ShellArgs += @("-Dapp.name=$($AppName)",$StartingClass)
}
Write-Output @{'java' = $javaCMD; 'args' = $ShellArgs}
}
End
{
}
}