# Custom Code & Resources Step

Custom code is configured on the "Installer->Screens & Actions->Custom Code" step.

![](../images/ui/beans_custom_code.png)

Entries in the custom code are used for

- specifying additional libraries that can be used in [scripts and expressions](../concepts/scripts.md) of [screens](screens.md), [actions](actions.md) and [form components](formComponents.md).
- developing new types of actions, screens or form components with the install4j API. See the [help topic on using the API](../api/installer.md) for more information.  Before you start to develop a new action, have a look at the available [actions](actions.md) and [screens](screens.md). If it is just a few lines of code, you can use the "Run script" action to enter them directly into install4j. If you would like to collect user input, most use cases can be solved with a [form screen](../concepts/formScreens.md).   An alternative way of adding your beans to the install4j is packaging them as an [extension](../api/extensions.md). In that case, you can select them directly from the standard registry dialogs instead of having to go through the "Search in custom code" menu entries when adding beans to the installer.
- including resource files into the installer. Resource files are arbitrary files like DLLs, external executables or text files that have to be available before the "Install files" action has run. All class files are packed into a single `user.jar` file, archives and resource files are extracted to the `user` subdirectory in the working directory of the installer. You can access a resource file named `file.txt` with the following expression in custom code:   new File("user", "file.txt")   To specify resource files in text fields in the installer configuration, use the sys.resourceDir installer variable:   ${installer:sys.resourceDir}/file.txt   To load native libraries in custom code, do not use `System.load(..)`, but rather `Util.loadNativeFromResources(...)` to load the library in the same class loader that loads scripts. For example, if you have added a native library `jni.dll` to your custom code, you can load it in a "Run script" action by calling   Util.loadNativeFromResources("jni.dll");

The following types of custom code locations are available:

- **Class or resource files** — For simple actions, screens or form components that do not depend on other classes, it is easiest to insert their class files directly, especially if you build your installer extensions together with your application. Anonymous inner classes will be included automatically. If you select a resource file, for example, an image, it will be added to the top-level directory of the custom JAR file and will be available via `Class.getResourceAsStream()`.
- **Directories** — With this type of entry you can add an entire directory. Make sure to select a classpath root directory, otherwise your classes cannot be loaded.
- **Scan Directories** — Use this type of entry to add all JAR and ZIP files in a selected directory.
- **Archives** — Use this type of entry to add a JAR file. Files that are present in both the custom code as well as the distribution tree will **not be packaged twice**. Files that are also present in the distribution tree can be freely added to your custom code, they will not increase the size of your installer. The compiler checks the source path of included files to determine if they are already present in the installer.
