Wiki source code of Deploying on Ubuntu 24.04

Last modified by Theodore Petrosky on 2026/04/16 05:47

Show last authors
1 These are the steps used to set up a WebObjects deployment environment on Ubuntu 24.04 with Java 21. It does not install WebObjects or any frameworks because it is assumed they are bundled with any apps you deploy. Change the environment variables in the first step if you want different install location or different user that will run the WebObjects applications.  Regardless, you will have to at least change SERVER_NAME and SERVER_IP which are only examples and ones you would never use in practice.
2
3 == Set environment variables for your configuration to be used in following scripts ==
4
5 For example
6
7 {{code}}
8 export SERVER_NAME=woserver.example.com
9 export SERVER_IP=172.5.4.3
10 export WEBOBJECTS_GROUP=webobjects
11 export WEBOBJECTS_USER=webobjects
12 export NEXT_ROOT=/opt/webobjects
13 export URL_PART=apps
14 {{/code}}
15
16 The default behaviour is for URL_PART to be "cgi-bin". I prefer to use "apps" in my WebObjects URLs.
17
18 == Install Java 21 and git ==
19
20 {{code}}
21 sudo apt install openjdk-21-jdk-headless
22 sudo apt install git
23 {{/code}}
24
25 At time of writing this was build 21.0.10+7-Ubuntu-124.04.
26
27 == Add user and group ==
28
29 {{code}}
30 sudo groupadd $WEBOBJECTS_GROUP
31 sudo useradd -m -g $WEBOBJECTS_GROUP -s /bin/bash $WEBOBJECTS_USER
32 echo -e "export NEXT_ROOT=$NEXT_ROOT" | sudo tee /home/$WEBOBJECTS_USER/.bash_profile
33 {{/code}}
34
35 (% id="HCreatedirectories" class="auto-cursor-target" %)
36 == Create directories ==
37
38 {{code}}
39 sudo mkdir -p /var/log/webobjects
40 sudo mkdir -p /etc/WebObjects/wotaskd
41 sudo mkdir -p /etc/WebObjects/JavaMonitor
42 {{/code}}
43
44 == Create configuration files ==
45
46 {{code}}
47 cat <<EOF | sudo tee /etc/default/webobjects
48 WEBOBJECTS_GROUP=$WEBOBJECTS_GROUP
49 WEBOBJECTS_USER=$WEBOBJECTS_USER
50 NEXT_ROOT=$NEXT_ROOT
51 JAVA_MONITOR_ARGS="-WOPort 56789"
52 WEBOBJECTS_URL=
53 EOF
54
55 cat <<EOF | sudo tee /etc/WebObjects/Properties
56 er.extensions.WOHostUtilities.localhostips=($SERVER_IP)
57 WOHost=$SERVER_IP
58 EOF
59
60 echo -e "WOHost=$SERVER_IP" | sudo tee /etc/WebObjects/wotaskd/Properties
61 echo -e "WOHost=$SERVER_IP" | sudo tee /etc/WebObjects/JavaMonitor/Properties
62 {{/code}}
63
64 (% id="HSetpermissions" class="auto-cursor-target" %)
65 == Set permissions ==
66
67 {{code}}
68 sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /var/log/webobjects
69 sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /etc/WebObjects
70 {{/code}}
71
72 (% id="HInstallwotaskdandjavamonitorfromprojectwonder" class="auto-cursor-target" %)
73 == Install wotaskd and javamonitor from project wonder ==
74
75 be careful of sed on Mac. there is a problem with sed, you may have to insert an empty set of quotes:
76
77 sudo sed -i '' '2s/= $/= ~-~-add-exports=java.base\/sun.security.action=ALL-UNNAMED/'
78
79 if you don't put the extra set of quotes, it will fail...
80
81 {{code}}
82 sudo mkdir -p $NEXT_ROOT/Local/Library/WebObjects/Applications
83 sudo mkdir -p $NEXT_ROOT/Local/Library/WebObjects/JavaApplications
84 cd $NEXT_ROOT/Local/Library/WebObjects/JavaApplications
85
86 sudo wget https://jenkins.wocommunity.org/job/Wonder7/lastSuccessfulBuild/artifact/Root/Roots/wotaskd.tar.gz
87 sudo tar zpxf wotaskd.tar.gz
88 sudo rm wotaskd.tar.gz
89
90 sudo wget https://jenkins.wocommunity.org/job/Wonder7/lastSuccessfulBuild/artifact/Root/Roots/JavaMonitor.tar.gz
91 sudo tar zpxf JavaMonitor.tar.gz
92 sudo rm JavaMonitor.tar.gz
93
94 sudo chown -R $WEBOBJECTS_USER:$WEBOBJECTS_GROUP $NEXT_ROOT/Local
95 sudo mkdir -p $NEXT_ROOT/bin
96 cd $NEXT_ROOT/bin
97 sudo ln -s $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/wotaskd
98 sudo ln -s $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor javamonitor
99
100 # Fix wotaskd and javamonitor to work with Java 17 if not already
101 sudo sed -i '2s/= $/= --add-exports=java.base\/sun.security.action=ALL-UNNAMED/' $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/Contents/UNIX/UNIXClassPath.txt
102 sudo sed -i '2s/= $/= --add-exports=java.base\/sun.security.action=ALL-UNNAMED/' $NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa/Contents/UNIX/UNIXClassPath.txt
103 {{/code}}
104
105 (% id="HCreateservicesforwotaskdandjavamonitor" class="auto-cursor-target" %)
106 == Create services for wotaskd and javamonitor ==
107
108 {{code}}
109 cat <<EOF | sudo tee /lib/systemd/system/wotaskd.service
110 [Unit]
111 Description=WebObjects/Wonder wotaskd
112 Documentation=https://wiki.wocommunity.org/display/documentation/Wonder+JavaMonitor+and+wotaskd
113 AssertPathExists=/var/log/webobjects
114 AssertPathExists=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa
115 After=network.target
116 [Service]
117 User=$WEBOBJECTS_USER
118 Group=$WEBOBJECTS_GROUP
119 Environment=NEXT_ROOT=$NEXT_ROOT
120 Environment="JVM_OPTIONS=-Xms32m -Xmx64m -XX:NewSize=2m"
121 ExecStart=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/wotaskd.woa/wotaskd -WOPort 1085 -Xms32m -Xmx64m >> /var/log/webobjects/wotaskd.log 2>&1
122 Restart=on-failure
123 RestartSec=5
124 [Install]
125 WantedBy=multi-user.target
126 EOF
127
128 cat <<EOF | sudo tee /lib/systemd/system/javamonitor.service
129 [Unit]
130 Description=WebObjects/Wonder JavaMonitor
131 Documentation=https://wiki.wocommunity.org/display/documentation/Wonder+JavaMonitor+and+wotaskd
132 AssertPathExists=/var/log/webobjects
133 AssertPathExists=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa
134 After=wotaskd.service
135 [Service]
136 User=$WEBOBJECTS_USER
137 Group=$WEBOBJECTS_GROUP
138 Environment=NEXT_ROOT=$NEXT_ROOT
139 Environment="JVM_OPTIONS=-Xms32m -Xmx64m -XX:NewSize=2m"
140 ExecStart=$NEXT_ROOT/Local/Library/WebObjects/JavaApplications/JavaMonitor.woa/JavaMonitor -WOPort 56789 -Xms32m -Xmx64m >> /var/log/webobjects/javamonitor.log 2>&1
141 Restart=on-failure
142 RestartSec=5
143 [Install]
144 WantedBy=multi-user.target
145 EOF
146
147 sudo systemctl daemon-reload
148
149 sudo systemctl enable wotaskd
150 sudo systemctl start wotaskd
151 sudo systemctl status wotaskd
152
153 # By default javamonitor does not automatically start
154 # if you want javamonitor to restart on a reboot, uncomment the next line
155 #sudo systemctl enable javamonitor
156 sudo systemctl start javamonitor
157 sudo systemctl status javamonitor
158 {{/code}}
159
160 (% id="HInstallApacheHTTPServer28MPMprefork29" class="auto-cursor-target" %)
161 == Install Apache HTTP Server (MPM prefork) ==
162
163 {{code}}
164 sudo apt install apache2 make apache2-dev -y
165 sudo a2dismod mpm_event
166 sudo a2enmod mpm_prefork
167 sudo a2enmod expires
168 sudo a2enmod ssl
169 sudo a2enmod rewrite
170
171 # Add ServerName to conf to avoid configtest errors
172 echo "ServerName $SERVER_NAME" | sudo tee /etc/apache2/conf-available/server-name.conf
173 sudo a2enconf server-name
174
175 # Install WebObjects adaptor
176 cd ~
177 git clone https://github.com/wocommunity/wonder.git
178 cd wonder/Utilities/Adaptors
179 sed -i '107s/CGI Apache2.2/Apache2.4/' make.config
180 sed -i '9s/MACOS/LINUX/' make.config
181 make
182 cd Apache2.4
183 sudo apxs -i -a -n WebObjects mod_WebObjects.la
184 sudo cp apache.conf /etc/apache2/mods-available/WebObjects.conf
185 sudo sed -i "7s/^LoadModule/# LoadModule/" /etc/apache2/mods-available/WebObjects.conf
186 sudo sed -i "15,18s/cgi-bin/$URL_PART/" /etc/apache2/mods-available/WebObjects.conf
187 sudo sed -i "38s/localhost/$SERVER_IP/" /etc/apache2/mods-available/WebObjects.conf
188 sudo a2enmod WebObjects
189
190 # Create Apache virtual host
191 sudo mkdir -p /var/www/$SERVER_NAME
192 sudo mkdir -p $NEXT_ROOT/Local/Library/WebServer/Documents/WebObjects
193 sudo ln -s $NEXT_ROOT/Local/Library/WebServer/Documents/WebObjects /var/www/$SERVER_NAME/WebObjects
194
195 cat <<EOF | sudo tee /etc/apache2/sites-available/$SERVER_NAME.conf
196 <VirtualHost *:80>
197 ServerName $SERVER_NAME
198 DocumentRoot /var/www/$SERVER_NAME
199 <Directory />
200 Require all denied
201 </Directory>
202 <Directory /var/www/$SERVER_NAME/>
203 Options Indexes FollowSymLinks MultiViews
204 AllowOverride None
205 Require all granted
206 </Directory>
207 <IfModule mod_expires.c>
208 ExpiresActive On
209 ExpiresByType text/html "access 5 minutes"
210 </IfModule>
211 ErrorLog \${APACHE_LOG_DIR}/error_apps_$SERVER_NAME.log
212 CustomLog \${APACHE_LOG_DIR}/access_apps_$SERVER_NAME.log combined
213 </VirtualHost>
214 EOF
215
216 sudo a2ensite $SERVER_NAME.conf
217
218 sudo apachectl configtest
219 sudo systemctl restart apache2
220 {{/code}}
221
222 (% id="HTroubleshooting" class="auto-cursor-target" %)
223 == Troubleshooting ==
224
225 {{code}}
226 # To test WOAdaptorInfo edit /etc/apache2/mods-available/WebObjects.conf and uncomment
227 WebObjectsAdminUsername public
228
229 #restart apache2
230 sudo systemctl restart apache2
231
232 #check in browser
233 http://woserver.example.com/apps/WebObjects/WOAdaptorInfo
234
235 #to turn on woadaptor logging
236 touch /tmp/logWebObjects
237
238 #might need to mkdir for adaptor logging
239 mkdir /Library
240 chown $WEBOBJECTS_USER:$WEBOBJECTS_GROUP /Library
241
242
243 # you must add to your apps Properties file:
244 WOFrameworksBaseURL=/WebObjects/{your-apps-name}.woa/Contents/Frameworks
245
246 {{/code}}