relpipe-data/examples-runnable-jars.xml
author František Kučera <franta-hg@frantovo.cz>
Mon, 21 Feb 2022 00:43:11 +0100
branchv_0
changeset 329 5bc2bb8b7946
parent 316 d7ae02390fac
permissions -rw-r--r--
Release v0.18

<stránka
	xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro">
	
	<nadpis>Finding runnable JARs</nadpis>
	<perex>look for Java archives with a main class</perex>
	<m:pořadí-příkladu>03900</m:pořadí-příkladu>

	<text xmlns="http://www.w3.org/1999/xhtml">
		
		<p>
			Java archives (<code>*.jar</code> files) that have set the main class can be started using <code>java -jar program.jar</code> command.
			Let us find all JARs under a certain directory that are runnable.
		</p>
		
		<m:pre src="examples/runnable-jars.sh" jazyk="bash"/>
		
		<p>
			The script above will print output like this one:
		</p>
		
		<m:pre src="examples/runnable-jars.txt" jazyk="text"/>
		
		<p>
			This pipeline consists of five steps:
		</p>
		
		<ul>
			<li>
				<code>findFiles</code>
				– prepares the list of files separated by <code>\0</code> byte;
				if we omit the <code>-iname '*.jar'</code>, the result will be the same,
				just more files will be examinated
			</li>
			<li>
				<code>fetchAttributes</code>
				– does the heavy work – tries to open each given file as a JAR (same as ZIP format)
				and looks for the <code>Main-Class</code> field in the <code>META-INF/MANIFEST.MF</code> file (if any);
				because the <code>jar_info</code> streamlet itself is written in Java, it simply uses existing Java functionality for main class lookup instead of reimplementing it in custom code;
				thanks to <code>--parallel N</code> option, utilizes N cores of our CPU;
				we can experiment with the N value and look how the total time decreases
			</li>
			<li>
				<code>filterRunable</code>
				– uses AWK to skip the records (files) that does not have a main class;
				in this step we could use also <code>relpipe-tr-sql</code> or <code>relpipe-tr-scheme</code> if we prefer SQL or Scheme to AWK
			</li>
			<li>
				<code>shortenPath</code>
				– replaces part of the absolute path with the <code>~</code> shortcut
				(just to make it shorter and hide our username)
			</li>
			<li>
				<code>relpipe-out-tabular</code>
				– formats the results as a table in the terminal (we could use e.g. <code>relpipe-out-gui</code> to call a GUI viewer or format the results as XML, CSV or other format)
			</li>
		</ul>
		
		<p>
			We can omit the <code>-iname '*.jar'</code> and run this pipeline on another directory
			in order to find all valid JAR and ZIP files regardless their extension.
			We will get also the number of entries (files and directories) in each archive.
			In future versions, this streamlet might be extended to optionally provide files from the archive or their list e.g. in form of XML.
		</p>
		
	</text>

</stránka>