Windows Service - help "Error: Could not find or load main class Files"

Trying to follow Install openHAB 2 in Windows 10 as Windows Service to get a windows service.

My Openhab2-wrapper.conf is as follows:

# ------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ------------------------------------------------------------------------
#********************************************************************
# Wrapper Properties
#********************************************************************
set.default.JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0_131
set.default.KARAF_HOME=C:\Users\tv\openhab\runtime\
set.default.KARAF_BASE=C:\Users\tv\openhab\userdata
set.default.KARAF_DATA=C:\Users\tv\openhab\userdata
set.default.KARAF_ETC=C:\Users\tv\openhab\userdata\etc
set.default.OPENHAB_HOME=C:\Users\tv\openhab
set.default.OPENHAB_CONF=%OPENHAB_HOME%\conf
set.default.OPENHAB_RUNTIME=%OPENHAB_HOME%\runtime
set.default.OPENHAB_USERDATA=%OPENHAB_HOME%\userdata
set.default.OPENHAB_LOGDIR=%OPENHAB_USERDATA%\logs
set.default.PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib
# Java Application
wrapper.working.dir=%KARAF_BASE%
wrapper.java.command=%JAVA_HOME%/bin/java
wrapper.java.mainclass=org.apache.karaf.wrapper.internal.service.Main
wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/*.jar
wrapper.java.classpath.2=%KARAF_BASE%/lib/wrapper/*.jar
wrapper.java.library.path.1=%KARAF_BASE%/lib/wrapper/
wrapper.java.library.path.2=%KARAF_BASE%/lib/wrapper/
# Application Parameters.  Add parameters as needed starting from 1
#wrapper.app.parameter.1=
# JVM Parameters
# note that n is the parameter number starting from 1.
wrapper.java.additional.1=-Dkaraf.home="%KARAF_HOME%"
wrapper.java.additional.2=-Dkaraf.base="%KARAF_BASE%"
wrapper.java.additional.3=-Dkaraf.data="%KARAF_DATA%"
wrapper.java.additional.4=-Dkaraf.etc="%KARAF_ETC%"
wrapper.java.additional.5=-Dcom.sun.management.jmxremote
wrapper.java.additional.6=-Dkaraf.startLocalConsole=false
wrapper.java.additional.7=-Dkaraf.startRemoteShell=true
wrapper.java.additional.8=-Djava.endorsed.dirs="%JAVA_HOME%/jre/lib/endorsed;%JAVA_HOME%/lib/endorsed;%KARAF_HOME%/lib/endorsed"
wrapper.java.additional.9=-Djava.ext.dirs="%JAVA_HOME%/jre/lib/ext;%JAVA_HOME%/lib/ext;%KARAF_HOME%/lib/ext"
wrapper.java.additional.10=-Djava.util.logging.config.file="C:\Users\tv\openhab\userdata\etc\java.util.logging.properties"
wrapper.java.additional.11=-Dopenhab.home=C:\Users\tv\openhab
wrapper.java.additional.12=-Dopenhab.conf=C:\Users\tv\openhab\conf
wrapper.java.additional.13=-Dopenhab.runtime=C:\Users\tv\openhab\runtime
wrapper.java.additional.14=-Dopenhab.userdata=C:\Users\tv\openhab\userdata
wrapper.java.additional.15=-Dopenhab.logdir=C:\Users\tv\openhab\userdata\logs
wrapper.java.additional.16=-Dorg.osgi.service.http.port=8080
wrapper.java.additional.17=-Dorg.osgi.service.http.port.secure=8443
# Uncomment to enable jmx
#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.port=1616
#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.authenticate=false
#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.ssl=false
# Uncomment to enable YourKit profiling
#wrapper.java.additional.n=-Xrunyjpagent
# Uncomment to enable remote debugging
#wrapper.java.additional.n=-Xdebug -Xnoagent -Djava.compiler=NONE
#wrapper.java.additional.n=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512
#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM
# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO
# Log file to use for wrapper output logging.
wrapper.logfile=%KARAF_DATA%/log/wrapper.log
# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM
# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO
# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=10m
# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=5
# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE
#********************************************************************
# Wrapper Windows Properties
#********************************************************************
# Title to use when running as a console
wrapper.console.title=openHAB2
#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.  The
#  service can then be reinstalled.
# Name of the service
wrapper.ntservice.name=openHAB2
# Display name of the service
wrapper.ntservice.displayname=openHAB2
# Description of the service
wrapper.ntservice.description=openHAB 2 Service
# Service dependencies.  Add dependencies as needed starting from 1
wrapper.ntservice.dependency.1=
# Mode in which the service is installed.  AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false

I’ve seen some messages in that thread about setting KARAF_HOME to \karaf which doesn’t exist on mine and gives me back the

Error: Could not find or load main class org.apache.karaf.wrapper.internal.service.Main

I’ve added an extra library lookup: wrapper.java.library.path.2=%KARAF_BASE%/lib/wrapper/ which stopped the above error and changed it to:

Error: Could not find or load main class Files

Any help appreciated (I’m on windows 10).

Did you run the following 2 commands in the console?

openhab> feature:install service-wrapper
openhab> wrapper:install --name "openHAB2" --display "openHAB2" --description "openHAB 2 Service"

The last command will create the karaf-wrapper-main.jar that is needed

Your path2 is the same as path1 (so, in theory it is not required)

Yeah I’ve got the service installed, but I created that before playing with the wrapper conf file. Do I need to recreate it?

Ahh right, I think this was supposed to be karaf_home so both dir were covered.

Oh I remember now… (I tried this stuff back in January and finally gave up on it :slight_smile:)

Change:
wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/.jar
to
wrapper.java.classpath.1=%KARAF_HOME%/lib/boot/
.jar

The file that is needed is org.apache.karaf.main-4.0.8.jar

check the last post on: Update windows.md by DimitrisSar · Pull Request #262 · openhab/openhab-docs · GitHub

no whatever I do I still seem to get the
Error: Could not find or load main class Files

With no further explanation or logging to tell me what class it’s missing.

check these new instructions and let me know if they work plz:

I follow that config, there were a few changes from the one I had. But one change I made was to set the wrapper log to default, which posted the Java command. It still didn’t work, but there’s the command it ran.

> C:\Users\tv\openhab\userdata\bin>"C:\Program Files (x86)\Java\jdk1.8.0_131\bin\java" -Dkaraf.home="C:\Users\tv\openhab\runtime\" -Dkaraf.base="C:\Users\tv\openhab\userdata" -Dkaraf.data="C:\Users\tv\openhab\userdata" -Dkaraf.etc="C:\Users\tv\openhab\userdata\etc" -Dcom.sun.management.jmxremote -Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true -Djava.endorsed.dirs="C:\Program Files (x86)\Java\jdk1.8.0_131/jre/lib/endorsed;C:\Program Files (x86)\Java\jdk1.8.0_131/lib/endorsed;C:\Users\tv\openhab\runtime/lib/endorsed" -Djava.ext.dirs="C:\Program Files (x86)\Java\jdk1.8.0_131/jre/lib/ext;C:\Program Files (x86)\Java\jdk1.8.0_131/lib/ext;C:\Users\tv\openhab\runtime/lib/ext" -Dopenhab.home="C:\Users\tv\openhab" -Dopenhab.conf="C:\Users\tv\openhab\conf" -Dopenhab.runtime="C:\Users\tv\openhab\runtime" -Dopenhab.userdata="C:\Users\tv\openhab\userdata" -Dopenhab.logdir="C:\Users\tv\openhab\logs" -Dfelix.cm.dir=C:\Users\tv\openhab\userdata\config -Dorg.osgi.service.http.port=8080 -Dorg.osgi.service.http.port.secure=8443 -Xmx512m -Djava.library.path="C:\Users\tv\openhab\userdata/lib/wrapper/" -classpath "C:\Users\tv\openhab\runtime\lib/boot/org.apache.karaf.diagnostic.boot-4.0.8.jar;C:\Users\tv\openhab\runtime\lib/boot/org.apache.karaf.jaas.boot-4.0.8.jar;C:\Users\tv\openhab\runtime\lib/boot/org.apache.karaf.main-4.0.8.jar;C:\Users\tv\openhab\runtime\lib/boot/org.osgi.core-6.0.0.jar;C:\Users\tv\openhab\userdata/lib/wrapper/karaf-wrapper-main.jar;C:\Users\tv\openhab\userdata/lib/wrapper/karaf-wrapper.jar" -Dwrapper.key="dk7PEbzTG6THdRsj" -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.debug="TRUE" -Dwrapper.pid=7400 -Dwrapper.version="3.2.3" -Dwrapper.native_library="wrapper" -Dwrapper.service="TRUE" -Dwrapper.cpu.timeout="10" -Dwrapper.jvmid=5 org.apache.karaf.wrapper.internal.service.Main

Where it had paths userdata/lib I’ve manually gone through the command and fixed those, but still getting “Error: Could not find or load main class files”

Some of the changes I noted between the default/what I had and the doco:
Java Home not specified in doco - so I’ve removed from mine

set.default.JAVA_HOME=C:\Program Files (x86)\Java\jdk1.8.0_131

These are not in the documentation:

set.default.OPENHAB_CONF=%OPENHAB_HOME%\conf
set.default.OPENHAB_RUNTIME=%OPENHAB_HOME%\runtime
set.default.OPENHAB_USERDATA=%OPENHAB_HOME%\userdata
set.default.OPENHAB_LOGDIR=%OPENHAB_USERDATA%\logs
1 Like

No clue what could be wrong… I don’t get this error :frowning:

Yeah, i took it out since if it exists in the Windows environment variables, it is not needed there anymore.

Oops! Thanx… I will add them

Updated the PR with:

# Wrapper Properties
set.default.OPENHAB_CONF=%OPENHAB_HOME%\conf
set.default.OPENHAB_RUNTIME=%OPENHAB_HOME%\runtime
set.default.OPENHAB_USERDATA=%OPENHAB_HOME%\userdata
set.default.OPENHAB_LOGDIR=%OPENHAB_HOME%\logs
set.default.KARAF_HOME=%OPENHAB_RUNTIME%
set.default.KARAF_BASE=%OPENHAB_USERDATA%
set.default.KARAF_DATA=%OPENHAB_USERDATA%
set.default.KARAF_ETC=%OPENHAB_USERDATA%\etc
set.default.PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib

to be the same style as in runtime/bin/oh2_dir_layout.bat

Any ideas how I can turn more debugging to figure out what class file it’s missing, and where it lives?

Maybe try wrapper.logfile.loglevel=DEBUG in the wrapper.conf
In theory, all *.jars that are needed are already covered by:

wrapper.java.classpath.1=%KARAF_HOME%/lib/boot/*.jar
wrapper.java.classpath.2=%KARAF_DATA%/lib/wrapper/*.jar

I had this same issue , i looked at the necessary classpath listed here and compared to the generated classpath in the wrapper.conf file, and noticed the following :

wrapper.java.classpath.1=%KARAF_BASE%/lib/boot/.jar
wrapper.java.classpath.2=%KARAF_BASE%/lib/wrapper/
.jar

compared to :
#wrapper.java.classpath.1=%KARAF_HOME%/lib/boot/.jar
#wrapper.java.classpath.2=%KARAF_DATA%/lib/wrapper/
.jar

Now KARAF_BASE is not identical to KARAF_HOME (but KARAF_DATA equals KARAF_HOME), so changing the first line to KARAF_HOME fixed this, but very annoying.

Now I can run my service, but when I log on to :8080 I get a Jetty error

HTTP ERROR 403
Problem accessing /. Reason:

Forbidden

This error I dont get when running from consolle so, back to more stupid error fixing then …

Programs written in Java programming language need a main method to be run/executed because it is where the program execution begins. While executing, when JVM does not find a .class file with the specified name then a run time error occurs saying “Could not found or load main class”. The reason why this happens is mostly due to:

  • Invalid Classpath
  • Wrong Class Name
  • File Extension
  • Wrong package

Main class could not be found when there is typo or wrong syntax in the fully qualified java class name or it does not exist in the provided classpath. You must ensure that you add the location of your .class file to your classpath. So, if its in the current folder, add . to your classpath. Note that the Windows classpath separator is a semi-colon( :wink: . If you want to execute the main() method in MainClass, you must use the full class name, including package name, in the java command.