Skip to content

How to install and run Java on PLCnext AXC 3152

Hi,

I'm trying to install and run any Java distribution on a PLCnext AXC 3152, but I can not get it to work. I want to run the AWS IoT Greengrass Core software on the controller. I do not want to run Greengrass inside a container, since I want to use it to launch other containers, which is not supported when running it as a container itself.

Goal:

My goal is to download a Java distribution and add its executables to PATH. To achieve this, I took the following steps. I used a freshly reset controller, where I only configured ntpd, for the correct system time and the controller is connected to the internet.

Steps:

1) Create a password for the root user: sudo passwd

2) Switch to the root user: su

2) Download a distribution:  wget https://corretto.aws/downloads/latest/amazon-corretto-17-x64-linux-jdk.tar.gz

3) Extract the archive: tar -xf amazon-corretto-17-x64-linux-jdk.tar.gz

4) Move the archive to /usr/lib/jvm/ : mv amazon-corretto-17.0.5.8.1-linux-x64 /usr/lib/jvm/

5) Verify the archive is listed in the JVM folder: ls /usr/lib/jvm

6) Create a new profile.d config to add the executables of the distribution to PATH: nano /etc/profile.d/java_home.sh. Content:

#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64
export PATH=$JAVA_HOME/bin:$PATH

7) Restart controller as root: reboot

8) Execute java command as admin user:

admin@axcf3152:~$ java --version
-sh: /usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin/java: No such file or directory


The problem and what I've tried so far

From the error above it seems, that as the admin user, it's not possible to execute the java command, since the folder does not exist, but when running stat on the file, it shows that it is in fact there:

admin@axcf3152:~$ stat /usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64
 File: /usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64
 Size: 4096   	Blocks: 8     IO Block: 4096  directory
Device: 0,21	Inode: 53799    Links: 9
Access: (0755/drwxr-xr-x) Uid: (  0/  root)  Gid: (  0/  root)
Access: 2022-10-25 14:17:25.375488766 +0000
Modify: 2022-10-13 05:07:51.000000000 +0000
Change: 2022-10-25 14:18:04.025766567 +0000
 Birth: 2022-10-25 14:17:25.375488766 +0000  

When running java --version as root we get the same error.


What I tried next was to execute the java binary directly, which does not work.

root@axcf3152:/usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin# java/
-sh: java/: Not a directory
root@axcf3152:/usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin# ./java
-sh: ./java: No such file or directory
root@axcf3152:/usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin# sh ./java
./java: ./java: cannot execute binary file
root@axcf3152:/usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin#


Running stat on the java executable, confirms that the file is executable and can be read by everyone.

root@axcf3152:/usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin# stat java
 File: java
 Size: 12984   	Blocks: 32     IO Block: 4096  regular file
Device: 179,1	Inode: 130092   Links: 1
Access: (0755/-rwxr-xr-x) Uid: (  0/  root)  Gid: (  0/  root)
Access: 2022-10-25 14:17:36.848349701 +0000
Modify: 2022-10-13 05:05:56.000000000 +0000
Change: 2022-10-25 14:17:36.849349774 +0000
 Birth: 2022-10-25 14:17:36.848349701 +0000


Running ldd on the java executable does not indicate, that any libraries are missing:

root@axcf3152:/usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin# ldd java
	linux-vdso.so.1 (0x00007ffc1a9fd000)
	libjli.so => /usr/lib/jvm/amazon-corretto-17.0.5.8.1-linux-x64/bin/./../lib/libjli.so (0x00007faf74e00000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00007faf7543a000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007faf75435000)
	libc.so.6 => /lib/libc.so.6 (0x00007faf74c00000)
	/lib64/ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x00007faf7544a000)


A user on StackOverflow pointed out, that not being able to execute a binary could be a sign that the binary was compiled for a different architecture , but when running arch this does not seem to be the case.

root@axcf3152:~# arch
x86_64


What's next

I'm currently trying to install binutils so that I can run readelf.


More details

So far I've tried the following distribution versions:

  • OpenJDK 19
  • Amazon Corretto 17


Controller Software information:

  • Firmware Version: 2022.6.1 (22.6.1.44)
  • Hardware Version: 02
  • FPGA Version: 1.1.14


Question

Did anyone manage to install and run Java on a PLCnext AXC 3152?

Comments

  • If you run the file command on the executable, you will probably see that the interpreter does not exist.

    Something similar was discussed recently, here:

    The quick solution is to create that missing interpreter as a symbolic link to the actual interpreter on the PLC.

    mkdir /lib64
    ln -sf /lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
    

    Hope this helps.

  • Helped and works now! Thanks! Maybe include it in the documentation? :)

  • Great to hear, thanks for the feedback.

    I could ask for this to be added to our documentaton, but I don't know where we would do that. We can't control what interpreter path is used in binaries that are built for other platforms. Some third-party binaries happen to include the correct interpreter path, and some don't.

    If a binary is built using the Software Development Kit for the correct PLCnext Control platform, then the correct interpreter path will definitely be included in the binary. It's not reasonable to expect every binary to work on a PLCnext Control device if it was not built using our SDK, but people are welcome to try their luck.

Sign In or Register to comment.