Closed fusion809 closed 7 years ago
I have managed to get a Recipe that builds an AppImage, although not a working one. This is my Recipe:
#!/bin/bash
# In this case, the upstream project seems to already
# provide binaries that are supposed to run everywhere,
# so we merely package these as an AppImage
set +e
APP="netbeans"
LOWERAPP="netbeans"
VERSION="7.0.1"
DATE="201609300101"
rm -rf ./$APP/$APP.AppDir
mkdir -p ./$APP/$APP.AppDir/usr/bin
mkdir -p ./$APP/$APP.AppDir/usr/lib
cd ./$APP
wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh
. ./functions.sh
generate_status
echo "deb http://archive.ubuntu.com/ubuntu/ trusty main restricted
deb-src http://archive.ubuntu.com/ubuntu/ trusty main restricted
deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted
deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted
deb http://archive.ubuntu.com/ubuntu/ trusty universe
deb-src http://archive.ubuntu.com/ubuntu/ trusty universe
deb http://archive.ubuntu.com/ubuntu/ trusty-updates universe
deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates universe
deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted
deb-src http://archive.ubuntu.com/ubuntu/ trusty-security main restricted
deb http://archive.ubuntu.com/ubuntu/ trusty-security universe
deb-src http://archive.ubuntu.com/ubuntu/ trusty-security universe
" > sources.list
apt-get $OPTIONS update
URLS=$(apt-get $OPTIONS -y install --print-uris $APP | cut -d "'" -f 2 | grep -e "^http")
wget -c $URLS
#wget -c http://download.netbeans.org/netbeans/$VERSION/final/zip/netbeans-$VERSION-$DATE.zip
wget -c "https://github.com/probonopd/AppImageKit/releases/download/5/AppRun" # (64-bit)
chmod a+x ./AppRun
cd ./$APP.AppDir/
find ../*.deb -exec dpkg -x {} . \;
#bsdtar -xf ../netbeans*.zip -C usr/share
#cp usr/share/$APP/bin/$APP usr/bin
wget -cqO- http://www.file-extensions.org/imgs/app-icon/128/5149/netbeans-icon.png > netbeans.png
echo "[Desktop Entry]
Encoding=UTF-8
Name=NetBeans IDE
Comment=The Smarter Way to Code
Exec=netbeans
Icon=netbeans
Categories=Application;Development;Java;IDE
Version=1.0
Type=Application
Terminal=0" > netbeans.desktop
chmod +x netbeans.desktop
cp netbeans.desktop usr/share/applications
get_apprun
rm -rf ./etc/ ./home/ || true
# patch_usr
# Patching only the executable files seems not to be enough for some apps
find usr/ -type f -exec sed -i -e "s|/usr|././|g" {} \;
cd ..
wget -c "https://github.com/probonopd/AppImageKit/releases/download/5/AppImageAssistant" # (64-bit)
chmod a+x ./AppImageAssistant
mkdir -p ../out
if [[ -f ../out/$APP"-"$VERSION"-x86_64.AppImage" ]]; then
rm $APP"-"$VERSION"-x86_64.AppImage"
fi
./AppImageAssistant ./$APP.AppDir/ ../out/$APP"-"$VERSION"-x86_64.AppImage"
The error I get whenever I try to run the AppImage generated by this is:
Cannot read cluster file: ././/share/netbeans/7.0.1/bin/../etc/netbeans.clusters
Please request an AppImage from the upstream NetBeans project :-)
Tried to do that, but they flagged my bug report as spam, rofl. Here is what I used in my report:
NetBeans would not need to be installed if this site provided an AppImage (https://appimage.org) for it. AppImages are a type of cross-distribution packaging format that does not need to be installed in order to be used. All that needs to be done in order to use them is to make them executable (with chmod +x) and execute them. No specialist software needs to be installed in order to run an AppImage.
I have sent an email requesting that they accept my bug report. But, there's no way for me to know how long it'll take for them to respond to it.
Did you get any response from upstream?
I haven't had a chance to file a feature request at their bug tracker thanks to them continually flagging my reports as spam. As previously mentioned I sent them an email mentioning this issue with their bug tracker, but still no reply has been received. Likewise I have created a new thread at their forums asking for help with their bug tracker, still no reply.
If you want to roll your own AppImage, I'd recommend something more along the lines of this - i.e., don't use deb packages if you can have upstream zip files.
That yaml has one issue. It bundles a proprietary JRE with the AppImage. The JREs provided by Oracle are licensed under a proprietary EULA. Hence OpenJDK must be used.
Can you point me to the exact paragraph that mandates that?
Not sure, I have asked about JRE bundling with other apps and the answer has been licensing restrictions prevent it. Been looking for this but so far I haven't found it. I also have a few other active issues I'm dealing with.
Well...
The Java™ Platform, Standard Edition Runtime Environment (JRE) is intended for software developers and vendors to redistribute with their applications.
http://www.oracle.com/technetwork/java/javase/jre-8-readme-2095710.html
I figured out where this was said. On the #flatpak IRC channel. I am asking them if they have logs, so I can find out who said it and ask them for proof.
Another dilemma is that NetBeans zip files do not have a download link that will always download the latest version of NetBeans, unlike your Mediakview yml, which will always download the latest version of Mediakview. As the download links for NetBeans zip files include the specific version being downloaded.
Yes, they seem to be hiding in https://netbeans.org/images_www/v6/download/8.2/final/js/files.js https://netbeans.org/images_www/v6/download/community/8.2/js/files.js The string "8.2" can be scraped from the headline on https://netbeans.org/downloads/index.html
Look at some of my other yml files to see how to do this with wget, cut, and sed.
Well this yaml I created:
app: netbeans
ingredients:
script:
- URL=http://download.netbeans.org/netbeans/8.2/final/zip/netbeans-8.2-201609300101.zip
- wget -c "$URL" --trust-server-names
- wget -c --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jre-8u66-linux-x64.tar.gz
- printf "8.2" > VERSION
script:
- mkdir -p usr/lib/jvm/
- tar xf ../jre* -C usr/lib/jvm/
- ( cd usr/bin ; ln -s ../lib/jvm/jre*/bin/java . )
- unzip ../netbeans*zip -d usr/
- rm -rf usr/bin
- mv ./usr/netbeans ./usr/bin
- ( cd ./usr/bin; ln -sf bin/netbeans . )
- find . -name *.exe -exec rm {} \;
- cat > netbeans.desktop <<\EOF
- [Desktop Entry]
- Name=NetBeans
- Exec=netbeans
- Icon=netbeans
- Type=Application
- Categories=IDE;Development;
- Comment=NetBeans IDE
- EOF
- cp ./usr/bin/nb/netbeans.png netbeans.png
the AppImage it builds to run giving the error:
/root/.cache/thumbnails/normal/a9e2e0e7bb9b3aa815aaf87cc982ba91.png is missing. Probably not running ./bin//netbeans.wrapper from within an AppImage.
Hence falling back to using .DirIcon
./bin//netbeans.wrapper: line 110: 2751 Aborted (core dumped) LD_LIBRARY_PATH="" zenity --question --title="$TITLE" --text="$TEXT" 2> /dev/null
Cannot find java. Please use the --jdkhome switch.
so quite clearly there is something that is needed to be done to make the JRE locatable.
JRE normally is relocateable - must be something else. Are you sure that your usr/bin/java symlink is actually working?
No it isn't actually there is no usr/bin/java symlink. I copied your Mediakview yaml's attempt at creating the symlink perfectly. Any idea why it doesn't exist?
Oh never mind, I know why. The netbeans zip contains a java folder. So there's a conflict. Is there a way to fix that? Like if I move the java folder to /usr/share/netbeans it probably won't be located properly.
Aha, I found a solution! Putting the java symlink in /bin. It's working, here is my yaml now:
app: netbeans
ingredients:
script:
- URL=http://download.netbeans.org/netbeans/8.2/final/zip/netbeans-8.2-201609300101.zip
- wget -c "$URL" --trust-server-names
- wget -c --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jre-8u66-linux-x64.tar.gz
- printf "8.2" > VERSION
script:
- mkdir -p usr/lib/jvm/
- tar xf ../jre* -C usr/lib/jvm/
- mkdir -p bin
- ( cd ./bin; ln -sf ../usr/lib/jvm/jre*/bin/java . )
- unzip ../netbeans*zip -d usr/
- rm -rf usr/bin
- mv ./usr/netbeans ./usr/bin
- ( cd ./usr/bin; ln -sf bin/netbeans . )
- find . -name *.exe -exec rm {} \;
- cat > netbeans.desktop <<\EOF
- [Desktop Entry]
- Name=NetBeans
- Exec=netbeans
- Icon=netbeans
- Type=Application
- Categories=IDE;Development;
- Comment=NetBeans IDE
- EOF
- cp ./usr/bin/nb/netbeans.png netbeans.png
One last problem I'm gonna try to solve: the AppImage is over 400 MB in size. I'm gonna strip some components used for other OSs.
Good! Run a tool like baobab
on the AppDir to find out what the large files and/or directories are.
Most of the space is being taken up by modules, which I assume are the jars used by NetBeans, so I don't think I can remove them. My only option for further cutting down on size (which I expect to cut at most 20 MB from its size, TBH) is to delete documentation files. Not sure if I should though, as an IDE is pretty useless unless it's well documented.
Well, if the original download is also that large, then it's how it is and there is not much you can do about it. Find a good hoster that accepts such large files, and make sure to include proper update information for binary delta updates.
Best one I know of is GitHub itself. https://github.com/fusion809/AppImages/releases/tag/netbeans8.2.
Best one I know of is GitHub itself
You are right. Testing it now.
Wow. Runs out of the box, as you can see took me less than a minute from 0 to 100. Awesome!
Hi,
I would like to build a NetBeans 8.2 AppImage and this is my current Recipe:
and I'm afraid it's failing at line 29 (the
URLS=...
line), specifically it's giving the error:Not sure how to fix it. Maybe line 24-25 (the
echo "deb ...
lines) should be extended to include extra trusty repos?Thanks for your time, Brenton