Bundling the Common Library into your Application
So you’ve built your Java Application against our Common Library. You load it on the JNIOR. You try to execute it and… It throws Class Not Found Exceptions!
This is because your application references the code in the Common Library but Janos cant find it. The only external JAR file to your application that JANOS can handle it the JanosClasses.jar file in the etc/ directory. That JAR file is bundled with the operating system.
So how do we handle this? We stuff all of the needed classes from the Common Library into your applications JAR file. Sure, you could take ALL of the classes but that would just waste space and slow do the program because it would be slightly slower to unpack the needed classes during execution.
To do this we can use the Java Dependencies windows application supplied with the Embedded JANOS SDK. We can inject some code into our build.xml file to pull all of the NEEDED classes out of the Common Library and place them in our applications build directory. This way they will be available when NetBeans goes to package the JAR file. That code looks like this…
<target name="-pre-jar"><!-- before we build the JAR file we need to get all of the classes out of thelibrary that our application depends on --><echo>Update classes directory with library dependencies</echo><exec dir="" resolveexecutable="true" executable="${janossdk.javadependencies}"><arg line="${build.classes.dir} '${libs.INTEG.Common.classpath}'"/></exec></target>
Now when our application is built the compilation output will show the Java class dependency discovery and what classes are copied into your application. Here is an example from a test applicaiton that will perform some logging and monitor some I/O. The application will perform 4 steps.
- First it will list all of the classes in the Common Library.
- Then it will parse the byte codes in the
.classfiles to find external class references. If the class depends on an external class then it is listed. If it is the first time the application saw that dependency then an * is appended. - Next each class that was depended on will be displayed along with a list of the classes that depended on it.
- Lastly, a list of each class that is copied along with its file size is displayed.
Update classes directory with library dependencies
Version 2.1
Project directory: C:\Users\kcloutier\Documents\Sandbox\Embedded Applications\Playground\CommonTest\build\classes
Library directory: C:\Users\kcloutier\Documents\Sandbox\Embedded Applications\INTEG Applications_Common\dist_Common.jar
--- Unpack Library: C:\Users\kcloutier\Documents\Sandbox\Embedded Applications\INTEG Applications_Common\dist_Common.jar to C:\INTEG\JANOS_SDK\temp
1 com/integ/common/CommonLib.class
2 com/integ/common/collections/BlockingQueue.class
3 com/integ/common/collections/CircularQueue.class
4 com/integ/common/datastructures/CircularQueue.class
5 com/integ/common/datastructures/ComparableLinkedListNode.class
6 com/integ/common/datastructures/LinkedList.class
7 com/integ/common/datastructures/LinkedListNode.class
8 com/integ/common/datastructures/Queue.class
9 com/integ/common/iolog/DigitalInputChannelEvent.class
10 com/integ/common/iolog/DigitalInputsEvent.class
11 com/integ/common/iolog/DigitalInputsIoLogMonitor.class
12 com/integ/common/iolog/IoChannelEvent.class
13 com/integ/common/iolog/IoChannelLogListener.class
14 com/integ/common/iolog/IoLogListener.class
15 com/integ/common/iolog/IoLogMonitor.class
16 com/integ/common/iolog/RelayOutputChannelEvent.class
17 com/integ/common/iolog/RelayOutputsEvent.class
18 com/integ/common/iolog/RelayOutputsIoLogMonitor.class
19 com/integ/common/logging/AppLog.class
20 com/integ/common/logging/BakFileLog.class
21 com/integ/common/logging/BakLogOutputStream.class
22 com/integ/common/logging/BufferedLineOutputStream.class
23 com/integ/common/logging/FileLog.class
24 com/integ/common/logging/FileLogService.class
25 com/integ/common/logging/LogOutputStream.class
26 com/integ/common/logging/Logger.class
27 com/integ/common/logging/NullOutLog.class
28 com/integ/common/logging/RollingFileLog.class
29 com/integ/common/logging/RollingLogOutputStream.class
30 com/integ/common/logging/SystemOutLog.class
31 com/integ/common/messagepump/ApplicationSystemMsg.class
32 com/integ/common/messagepump/MessagePumpAppHandler.class
33 com/integ/common/messagepump/MessagePumpAppMessageListener.class
34 com/integ/common/messagepump/MessagePumpEngine$1.class
35 com/integ/common/messagepump/MessagePumpEngine$2.class
36 com/integ/common/messagepump/MessagePumpEngine.class
37 com/integ/common/messagepump/MessagePumpListener.class
38 com/integ/common/messagepump/SystemMsgTypes.class
39 com/integ/common/net/AsciiCommandClient.class
40 com/integ/common/net/BytesReceivedEvent.class
41 com/integ/common/net/ClientListener.class
42 com/integ/common/net/IClient.class
43 com/integ/common/net/MessageReceivedEvent.class
44 com/integ/common/net/NullClient.class
45 com/integ/common/net/TCPConnectionListenerNotifier.class
46 com/integ/common/net/TcpConnection$1.class
47 com/integ/common/net/TcpConnection.class
48 com/integ/common/net/TcpConnectionListener.class
49 com/integ/common/net/TcpServer.class
50 com/integ/common/net/TcpServerEvent.class
51 com/integ/common/net/TcpServerListener.class
52 com/integ/common/net/UdpConnectionListener.class
53 com/integ/common/net/UdpServer.class
54 com/integ/common/net/http/HttpRequest.class
55 com/integ/common/net/http/HttpResponse.class
56 com/integ/common/net/http/HttpURL.class
57 com/integ/common/net/protocols/MessageListener.class
58 com/integ/common/net/protocols/modbus/ModbusCollection.class
59 com/integ/common/net/protocols/modbus/connections/ModbusConnection.class
60 com/integ/common/net/protocols/modbus/connections/SerialModbusConnection.class
61 com/integ/common/net/protocols/modbus/connections/TcpModbusConnection.class
62 com/integ/common/net/protocols/modbus/functions/LoginRequest.class
63 com/integ/common/net/protocols/modbus/functions/LoginResponse.class
64 com/integ/common/net/protocols/modbus/functions/ModbusFunctionRequest.class
65 com/integ/common/net/protocols/modbus/functions/ModbusFunctionResponse.class
66 com/integ/common/net/protocols/modbus/functions/ModbusPdu.class
67 com/integ/common/net/protocols/modbus/functions/ReadCoils.class
68 com/integ/common/net/protocols/modbus/functions/ReadDiscreteInputs.class
69 com/integ/common/net/protocols/modbus/functions/ReadHoldingRegisters.class
70 com/integ/common/net/protocols/modbus/functions/ReadHoldingRegistersRequest.class
71 com/integ/common/net/protocols/modbus/functions/ReadHoldingRegistersResponse.class
72 com/integ/common/net/protocols/modbus/functions/ReadInputRegisters.class
73 com/integ/common/net/protocols/modbus/functions/ReportSlaveId.class
74 com/integ/common/net/protocols/modbus/functions/WriteMultipleCoils.class
75 com/integ/common/net/protocols/modbus/functions/WriteMultipleRegisters.class
76 com/integ/common/net/protocols/modbus/functions/WriteSingleCoil.class
77 com/integ/common/net/protocols/modbus/functions/WriteSingleRegister.class
78 com/integ/common/net/protocols/modbus/protocols/ModbusAsciiProtocol.class
79 com/integ/common/net/protocols/modbus/protocols/ModbusProtocol.class
80 com/integ/common/net/protocols/modbus/protocols/ModbusRTUProtocol.class
81 com/integ/common/net/protocols/modbus/protocols/ModbusTCPProtocol.class
82 com/integ/common/system/Application.class
83 com/integ/common/system/ApplicationWatchdog.class
84 com/integ/common/system/AssemblyBase.class
85 com/integ/common/system/JniorApplication.class
86 com/integ/common/system/ReleaseInfo.class
87 com/integ/common/system/UnitConfig.class
88 com/integ/common/utils/DateUtils.class
89 com/integ/common/utils/ExceptionUtils.class
90 com/integ/common/utils/FileUtils.class
91 com/integ/common/utils/HexUtils.class
92 com/integ/common/utils/JsonUtils.class
93 com/integ/common/utils/ObjectUtils.class
94 com/integ/common/utils/RegistryUtils.class
95 com/integ/common/utils/StringUtils.class
96 java/text/QuickDateFormat.class
Parsing commontest/AssemblyInfo ---
commontest/AssemblyInfo requires the following classes ---
Depends on: com/integ/common/system/AssemblyBase *
Parsing commontest/CommonTest ---
commontest/CommonTest requires the following classes ---
Depends on: com/integ/common/system/JniorApplication *
Parsing commontest/IoLogTest$1 ---
commontest/IoLogTest$1 requires the following classes ---
Depends on: com/integ/common/iolog/IoLogListener *
Depends on: java/text/QuickDateFormat *
Parsing commontest/IoLogTest ---
commontest/IoLogTest requires the following classes ---
Depends on: com/integ/common/iolog/DigitalInputsIoLogMonitor *
Depends on: java/text/QuickDateFormat
Parsing commontest/LogTest ---
commontest/LogTest requires the following classes ---
Depends on: com/integ/common/logging/Logger *
Depends on: com/integ/common/logging/RollingFileLog *
Depends on: com/integ/common/logging/BakFileLog *
Depends on: com/integ/common/logging/SystemOutLog *
Depends on: com/integ/common/logging/NullOutLog *
Parsing com/integ/common/system/AssemblyBase ---
Parsing com/integ/common/system/JniorApplication ---
Parsing com/integ/common/iolog/IoLogListener ---
Parsing java/text/QuickDateFormat ---
Parsing com/integ/common/iolog/DigitalInputsIoLogMonitor ---
com/integ/common/iolog/DigitalInputsIoLogMonitor requires the following classes ---
Depends on: com/integ/common/iolog/DigitalInputChannelEvent *
Depends on: com/integ/common/iolog/IoChannelLogListener *
Depends on: com/integ/common/iolog/IoLogMonitor *
Depends on: com/integ/common/system/UnitConfig *
Depends on: java/text/QuickDateFormat
Parsing com/integ/common/logging/Logger ---
Parsing com/integ/common/logging/RollingFileLog ---
com/integ/common/logging/RollingFileLog requires the following classes ---
Depends on: com/integ/common/logging/Logger
Depends on: com/integ/common/logging/RollingLogOutputStream *
Depends on: com/integ/common/logging/FileLog *
Depends on: com/integ/common/logging/FileLogService *
Depends on: com/integ/common/logging/SystemOutLog
Parsing com/integ/common/logging/BakFileLog ---
com/integ/common/logging/BakFileLog requires the following classes ---
Depends on: com/integ/common/logging/Logger
Depends on: com/integ/common/logging/BakLogOutputStream *
Depends on: com/integ/common/logging/FileLog
Depends on: com/integ/common/logging/FileLogService
Depends on: com/integ/common/logging/SystemOutLog
Parsing com/integ/common/logging/SystemOutLog ---
com/integ/common/logging/SystemOutLog requires the following classes ---
Depends on: com/integ/common/logging/Logger
Parsing com/integ/common/logging/NullOutLog ---
com/integ/common/logging/NullOutLog requires the following classes ---
Depends on: com/integ/common/logging/Logger
Parsing com/integ/common/iolog/DigitalInputChannelEvent ---
com/integ/common/iolog/DigitalInputChannelEvent requires the following classes ---
Depends on: com/integ/common/iolog/IoChannelEvent *
Parsing com/integ/common/iolog/IoChannelLogListener ---
Parsing com/integ/common/iolog/IoLogMonitor ---
com/integ/common/iolog/IoLogMonitor requires the following classes ---
Depends on: com/integ/common/iolog/DigitalInputsIoLogMonitor
Depends on: com/integ/common/iolog/RelayOutputsIoLogMonitor *
Depends on: com/integ/common/iolog/IoLogListener
Depends on: java/text/QuickDateFormat
Depends on: com/integ/common/iolog/IoChannelLogListener
Depends on: com/integ/common/logging/SystemOutLog
Depends on: com/integ/common/logging/Logger
Parsing com/integ/common/system/UnitConfig ---
Parsing com/integ/common/logging/RollingLogOutputStream ---
com/integ/common/logging/RollingLogOutputStream requires the following classes ---
Depends on: com/integ/common/logging/LogOutputStream *
Parsing com/integ/common/logging/FileLog ---
com/integ/common/logging/FileLog requires the following classes ---
Depends on: java/text/QuickDateFormat
Depends on: com/integ/common/logging/BufferedLineOutputStream *
Depends on: com/integ/common/logging/Logger
Depends on: com/integ/common/logging/LogOutputStream
Depends on: com/integ/common/logging/FileLogService
Parsing com/integ/common/logging/FileLogService ---
com/integ/common/logging/FileLogService requires the following classes ---
Depends on: com/integ/common/logging/Logger
Parsing com/integ/common/logging/BakLogOutputStream ---
com/integ/common/logging/BakLogOutputStream requires the following classes ---
Depends on: com/integ/common/logging/LogOutputStream
Depends on: com/integ/common/utils/FileUtils *
Parsing com/integ/common/iolog/IoChannelEvent ---
Parsing com/integ/common/iolog/RelayOutputsIoLogMonitor ---
com/integ/common/iolog/RelayOutputsIoLogMonitor requires the following classes ---
Depends on: com/integ/common/iolog/RelayOutputChannelEvent *
Depends on: com/integ/common/iolog/IoChannelLogListener
Depends on: com/integ/common/iolog/IoLogMonitor
Depends on: com/integ/common/system/UnitConfig
Depends on: java/text/QuickDateFormat
Parsing com/integ/common/logging/LogOutputStream ---
com/integ/common/logging/LogOutputStream requires the following classes ---
Depends on: com/integ/common/utils/FileUtils
Parsing com/integ/common/logging/BufferedLineOutputStream ---
Parsing com/integ/common/utils/FileUtils ---
Parsing com/integ/common/iolog/RelayOutputChannelEvent ---
com/integ/common/iolog/RelayOutputChannelEvent requires the following classes ---
Depends on: com/integ/common/iolog/IoChannelEvent
com/integ/common/iolog/DigitalInputChannelEvent
is referenced by com/integ/common/iolog/DigitalInputsIoLogMonitor
com/integ/common/iolog/DigitalInputsIoLogMonitor
is referenced by commontest/IoLogTest
is referenced by com/integ/common/iolog/IoLogMonitor
com/integ/common/iolog/IoChannelEvent
is referenced by com/integ/common/iolog/DigitalInputChannelEvent
is referenced by com/integ/common/iolog/RelayOutputChannelEvent
com/integ/common/iolog/IoChannelLogListener
is referenced by com/integ/common/iolog/DigitalInputsIoLogMonitor
is referenced by com/integ/common/iolog/IoLogMonitor
is referenced by com/integ/common/iolog/RelayOutputsIoLogMonitor
com/integ/common/iolog/IoLogListener
is referenced by commontest/IoLogTest$1
is referenced by com/integ/common/iolog/IoLogMonitor
com/integ/common/iolog/IoLogMonitor
is referenced by com/integ/common/iolog/DigitalInputsIoLogMonitor
is referenced by com/integ/common/iolog/RelayOutputsIoLogMonitor
com/integ/common/iolog/RelayOutputChannelEvent
is referenced by com/integ/common/iolog/RelayOutputsIoLogMonitor
com/integ/common/iolog/RelayOutputsIoLogMonitor
is referenced by com/integ/common/iolog/IoLogMonitor
com/integ/common/logging/BakFileLog
is referenced by commontest/LogTest
com/integ/common/logging/BakLogOutputStream
is referenced by com/integ/common/logging/BakFileLog
com/integ/common/logging/BufferedLineOutputStream
is referenced by com/integ/common/logging/FileLog
com/integ/common/logging/FileLog
is referenced by com/integ/common/logging/RollingFileLog
is referenced by com/integ/common/logging/BakFileLog
com/integ/common/logging/FileLogService
is referenced by com/integ/common/logging/RollingFileLog
is referenced by com/integ/common/logging/BakFileLog
is referenced by com/integ/common/logging/FileLog
com/integ/common/logging/Logger
is referenced by commontest/LogTest
is referenced by com/integ/common/logging/RollingFileLog
is referenced by com/integ/common/logging/BakFileLog
is referenced by com/integ/common/logging/SystemOutLog
is referenced by com/integ/common/logging/NullOutLog
is referenced by com/integ/common/iolog/IoLogMonitor
is referenced by com/integ/common/logging/FileLog
is referenced by com/integ/common/logging/FileLogService
com/integ/common/logging/LogOutputStream
is referenced by com/integ/common/logging/RollingLogOutputStream
is referenced by com/integ/common/logging/FileLog
is referenced by com/integ/common/logging/BakLogOutputStream
com/integ/common/logging/NullOutLog
is referenced by commontest/LogTest
com/integ/common/logging/RollingFileLog
is referenced by commontest/LogTest
com/integ/common/logging/RollingLogOutputStream
is referenced by com/integ/common/logging/RollingFileLog
com/integ/common/logging/SystemOutLog
is referenced by commontest/LogTest
is referenced by com/integ/common/logging/RollingFileLog
is referenced by com/integ/common/logging/BakFileLog
is referenced by com/integ/common/iolog/IoLogMonitor
com/integ/common/system/AssemblyBase
is referenced by commontest/AssemblyInfo
com/integ/common/system/JniorApplication
is referenced by commontest/CommonTest
com/integ/common/system/UnitConfig
is referenced by com/integ/common/iolog/DigitalInputsIoLogMonitor
is referenced by com/integ/common/iolog/RelayOutputsIoLogMonitor
com/integ/common/utils/FileUtils
is referenced by com/integ/common/logging/BakLogOutputStream
is referenced by com/integ/common/logging/LogOutputStream
java/text/QuickDateFormat
is referenced by commontest/IoLogTest$1
is referenced by commontest/IoLogTest
is referenced by com/integ/common/iolog/DigitalInputsIoLogMonitor
is referenced by com/integ/common/iolog/IoLogMonitor
is referenced by com/integ/common/logging/FileLog
is referenced by com/integ/common/iolog/RelayOutputsIoLogMonitor
Copy com\integ\common\iolog\DigitalInputChannelEvent.class (0.50KB)
Copy com\integ\common\iolog\DigitalInputsIoLogMonitor.class (2.73KB)
Copy com\integ\common\iolog\IoChannelEvent.class (0.46KB)
Copy com\integ\common\iolog\IoChannelLogListener.class (0.21KB)
Copy com\integ\common\iolog\IoLogListener.class (0.21KB)
Copy com\integ\common\iolog\IoLogMonitor.class (6.01KB)
Copy com\integ\common\iolog\RelayOutputChannelEvent.class (0.47KB)
Copy com\integ\common\iolog\RelayOutputsIoLogMonitor.class (2.69KB)
Copy com\integ\common\logging\BakFileLog.class (1.95KB)
Copy com\integ\common\logging\BakLogOutputStream.class (1.74KB)
Copy com\integ\common\logging\BufferedLineOutputStream.class (1.09KB)
Copy com\integ\common\logging\FileLog.class (2.66KB)
Copy com\integ\common\logging\FileLogService.class (2.13KB)
Copy com\integ\common\logging\Logger.class (2.49KB)
Copy com\integ\common\logging\LogOutputStream.class (1.87KB)
Copy com\integ\common\logging\NullOutLog.class (0.68KB)
Copy com\integ\common\logging\RollingFileLog.class (1.97KB)
Copy com\integ\common\logging\RollingLogOutputStream.class (3.20KB)
Copy com\integ\common\logging\SystemOutLog.class (0.70KB)
Copy com\integ\common\system\AssemblyBase.class (1.56KB)
Copy com\integ\common\system\JniorApplication.class (0.49KB)
Copy com\integ\common\system\UnitConfig.class (1.60KB)
Copy com\integ\common\utils\FileUtils.class (4.33KB)
Copy java\text\QuickDateFormat.class (5.75KB)
Copied 24 files totalling 47.50KB
3.07 seconds