SwiftJava tools can be configured using the swift-java.config file.
The swift-java.config file lives alongside each target that needs
swift-java code generation. It selects tool modes, sets output paths,
and controls per-mode filters. Below: the file layout, then the full
list of supported keys.
You can refer to the SwiftJavaConfigurationShared/Configuration struct to learn about the supported options.
Configuration from the config files may be overriden or augmented by explicit command line parameters, please refer to the options documentation for details on their behavior.
The configuration is a JSON 5 file, which among other things allows // and /* */ comments, so feel free to add line comments explaining rationale for some of the settings in your configuration.
- Type:
LogLevel?
The minimum log level at which log messages will be printed at by swift-java.
Values:
tracedebuginfonoticewarningerrorcritical
- Type:
String?
The Java package the generated Java code should be emitted into.
jextract requires a non-empty Java package name. The unnamed/default package is not supported.
Example:
"com.example.mypackage"- Type:
String?
The name of the Swift module into which the resulting Swift types will be generated.
- Type:
String?
The name of the native library to load at runtime via System.loadLibrary().
Defaults to the Swift module name when not set. Use this when the dynamic
library product has a different name than the module being exported
(e.g. the module is MyLibrary but the dylib is MyLibrarySwiftJava or something else).
- Type:
[String]?
When non-nil, overrides the library loading statements emitted in the
static {} / initializeLibs() block of generated Java classes.
Each string is emitted as a verbatim Java statement.
When nil (the default), the standard loading calls are emitted.
When set to an empty array [], no library loading code is emitted at all.
- Type:
String?
Directory containing Swift files which should be extracted into Java bindings (jextract mode).
Must be paired with outputSwiftDirectory and outputJavaDirectory.
- Type:
String?
The directory where generated Swift files should be written. Generally used with jextract mode.
- Type:
String?
The directory where generated Java files should be written. Generally used with jextract mode.
- Type:
Int? - Default:
3
Maximum number of overloads to generate for a function with a variadic parameter.
When a variadic parameter T... is encountered, the generator will produce
up to maxVariadicOverloads distinct overloads instead of failing.
Example:
func concat(s: String...) -> Stringresults in:
// Java
String concat() -> String
String concat(s0: String, s1: String) -> String
String concat(s0: String, s1: String, s2: String) -> StringThe reason for this is that Swift cannot "splat" an array into a ...
parameter, therefore we cannot transfer an arbitrary amount of varargs
parameters over the native boundary.
- Type:
JExtractGenerationMode? - Default:
ffm
Determine jextract source generation mode, using JNI or FFM.
Values:
ffm- Foreign Value and Memory APIjni- Java Native Interface
- Type:
Bool? - Default:
false
Some build systems require an output to be present when it was "expected", even if empty. This is used by the JExtractSwiftPlugin build plugin, but otherwise should not be necessary.
- Type:
AccessLevelMode? - Default:
public
The lowest access level of Swift declarations that should be extracted, defaults to public.
Values:
publicpackageinternal
- Type:
JExtractMemoryManagementMode? - Default:
explicit
The memory management mode to use for the generated code. By default, the user must explicitly
provide a SwiftArena to all calls that require it. By choosing allowGlobalAutomatic, the user
can omit this parameter and a global GC-based arena will be used.
Values:
explicit- Force users to provide an explicitSwiftArenato all calls that require them.allowGlobalAutomatic- Provide both explicitSwiftArenasupport and a default global automaticSwiftArenathat will deallocate memory when the GC decides to.
- Type:
JExtractAsyncFuncMode? - Default:
completableFuture
The mode to use for extracting asynchronous Swift functions. By default async methods are
extracted as Java functions returning CompletableFuture.
Values:
completableFuture- Extract SwiftasyncAPIs as Java functions that returnCompletableFutures.legacyFuture- Extract SwiftasyncAPIs as Java functions that returnFutures.
- Type:
JavaSourceLevel? - Default:
22
The Java source level to target when generating Java code.
Values:
171821222425
- Type:
Bool? - Default:
false
By enabling this mode, JExtract will generate Java code that allows you to implement Swift
protocols using Java classes. This feature requires disabling the SwiftPM sandbox, and is
only supported in jni mode.
- Type:
Bool? - Default:
false
If true, JExtract fails after generating when it skipped any declaration it could not extract or translate, and lists each one. Skipped declarations are always reported as warnings.
- Type:
Bool? - Default:
false
If true, Swift enums whose cases have no associated values are generated as Java enums,
with one constant per case, instead of classes wrapping a Swift value. Only supported in
jni mode.
- Type:
String?
If specified, JExtract will output to this file a list of paths to all generated Java source files.
- Type:
String?
If set, only generate bindings for this single Swift type name
- Type:
String?
If set, JExtract (JNI mode) will write a linker version script to this
path, listing all generated JNI @_cdecl entry-point symbols as
global exports and hiding everything else with local: *. Pass this
file to the linker via -Xlinker --version-script=<path> to enable
precise dead-code elimination of unused Swift code in the final shared
library.
- Type:
[String]?
Include only Swift source files or types matching these patterns during jextract.
File-path patterns (containing /, or ending in .swift /
.swiftinterface): matched against relative file paths. Supports * and
** wildcards. Example: Models/**, **/User.swift, MyType.swift.
Type-name patterns (containing .): matched against the dotted nested
type path (e.g. Outer.Inner, Outer.**, **.User, Logger.Internal*).
The qualified name does NOT include the module prefix.
. is the separator. :: is reserved by Swift for module disambiguation
(SE-0491) and is NOT used by these filters.
Plain names (no separator) match both: a filename without .swift, or the
top-level component of a type name
- Type:
[String]?
Exclude Swift source files or types matching these patterns during jextract.
Same pattern syntax as swiftFilterInclude
- Type:
[String: [String]]?
Stub type declarations for imported modules whose source is not available to the jextract tool. Keyed by module name, values are arrays of Swift declaration strings that will be parsed as if they belonged to that module.
Example:
{
"importedModuleStubs": {
"ExternalModule": [
"public enum Outer {}",
"public struct Config {}"
]
}
}- Type:
[String: SpecializationConfigEntry]?
Force specialization of generic types, mapping them to a specific generated Java-facing name. This allows generating generic specializations that can be used only with some specific bound generic argument, rather than using the usual generic machinery. Sometimes useful if a generic type is only reasonably usable with some specific type.
Generating specializations takes into account Swift extensions where the generic is bound to that type, for example, a Box<T>
type, would automatically gain T == Fish specific methods in the generated Java sources if there is an extension ... where T == Fish declared in Swift:
struct Box<T> {}
extension Box where T == Fish {
func feedFish()
}When configured as follows:
{
"specialize": {
"FishBox": {
"base": "Box",
"typeArgs": {"Element": "Fish"}
},
"ToolBox": {
"base": "Box",
"typeArgs": {"Element": "Tool"}
}
}
}Would result in Java code with the generated feedFish() method on the FishBox Java type:
FishBox box = ...;
box.feedFish(); // type-safe generated specialized functionIt is also possible to cause such specialization to occur by declaring a typealias in Swift sources:
typealias FishBox = Box<Fish>So this configuration option is geared towards times when you do not control the sources that wrappers are being generated for.
SpecializationConfigEntry:
Configuration entry for specializing a generic type into a concrete Java class. The dictionary key is the Java-facing name; this entry provides the base type and type argument mapping.
base:String- The base Swift type name (e.g. "Box")typeArgs:[String: String]- Mapping from generic parameter name to concrete type (e.g. {"Element": "Fish"})
- Type:
String?
If set, use this JSON file as the static build configuration for jextract. This allows users to provide a custom StaticBuildConfiguration for #if resolution.
You can generate one for a specific target triple using the Swift compiler itself:
swift frontend -print-static-build-config -target <triple> > static-build-config.json
Example:
The configuration option is a path with a file generated like above, which will have a structure similar to this:
{
"attributes": [],
"compilerVersion": {
"components": [6, 3]
},
"customConditions": [
"DEBUG"
],
"endianness": "little",
"features": [],
"languageMode": {
"components": [5, 10]
},
"targetArchitectures": [],
"targetAtomicBitWidths": [],
"targetEnvironments": [],
"targetOSs": [],
"targetObjectFileFormats": [],
"targetPointerAuthenticationSchemes": [],
"targetPointerBitWidth": 64,
"targetRuntimes": []
}- Type:
String?
The Java class path that should be passed along to the swift-java tool.
- Type:
[String: String]? - Default: empty dictionary (
[:])
The Java classes that should be translated to Swift. The keys are canonical Java class names (e.g., java.util.ArrayList) and the values are the corresponding Swift names (e.g., JavaArrayList).
Example:
{
"classes": {
"java.util.ArrayList": "JavaArrayList",
"java.util.HashMap": "JavaHashMap"
}
}- Type:
[JavaFullyQualifiedTypeName]?
Java classes whose Swift wrapper type is owned by another module, but which this module should generate an extension of.
- Type:
JavaVersion?
Compile for the specified Java SE release.
JavaVersion is an integer identifying a Java SE release, in the same
shape as javaSourceLevel. Supported values:
171821222425
- Type:
JavaVersion?
Generate class files suitable for the specified Java SE release.
JavaVersion is an integer identifying a Java SE release, in the same
shape as javaSourceLevel. Supported values:
171821222425
- Type:
[String]?
Filter input Java types by their package prefix if set
- Type:
[String]?
Exclude input Java types by their package prefix or exact match
- Type:
String?
If set, place all generated code in this single Swift file instead of one file per class.
- Type:
[JavaDependencyDescriptor]?
Java dependencies we need to fetch for this target.
JavaDependencyDescriptor:
Represents a maven-style Java dependency.
Encoded in JSON as a single groupID:artifactID:version coordinate string
(Gradle-style notation), not as a keyed object.
Example:
{
"dependencies": [
"com.google.code.gson:gson:2.10.1"
]
}groupID:StringartifactID:Stringversion:String
- Type:
[MavenRepositoryDescriptor]?
Custom Maven repositories to use when resolving dependencies. If not set, defaults to mavenCentral().
MavenRepositoryDescriptor:
Describes a Maven-style repository for dependency resolution.
Supported types based on https://docs.gradle.org/current/userguide/supported_repository_types.html:
maven(url:artifactUrls:)- A custom Maven repository at the given URLmavenCentral- Maven Central repositorymavenLocal(includeGroups:)- Local Maven cache (~/.m2/repository)google- Google's Maven repository
Example:
{
"mavenRepositories": [
{ "type": "mavenCentral" },
{ "type": "maven", "url": "https://repo.example.com/maven2" },
{ "type": "mavenLocal", "includeGroups": ["com.example"] },
{ "type": "google" }
]
}