@@ -89,6 +89,10 @@ object JlinkPlugin extends AutoPlugin {
8989 module
9090 }.distinct
9191 },
92+ jlinkModulePath := (jlinkModulePath ?? Nil ).value,
93+ jlinkModulePath ++= {
94+ fullClasspath.in(jlinkBuildImage).value.map(_.data)
95+ },
9296 jlinkOptions := (jlinkOptions ?? Nil ).value,
9397 jlinkOptions ++= {
9498 val modules = jlinkModules.value
@@ -97,7 +101,11 @@ object JlinkPlugin extends AutoPlugin {
97101 sys.error(" jlinkModules is empty" )
98102 }
99103
100- JlinkOptions (addModules = modules, output = Some (target.in(jlinkBuildImage).value))
104+ JlinkOptions (
105+ addModules = modules,
106+ output = Some (target.in(jlinkBuildImage).value),
107+ modulePath = jlinkModulePath.value
108+ )
101109 },
102110 jlinkBuildImage := {
103111 val log = streams.value.log
@@ -129,25 +137,28 @@ object JlinkPlugin extends AutoPlugin {
129137 .pair(file => IO .relativize(dir, file))
130138
131139 private def runJavaTool (jvm : Option [File ], log : Logger )(exeName : String , args : Seq [String ]): ProcessBuilder = {
132- val exe = jvm match {
133- case None => exeName
134- case Some (jh) => (jh / " bin" / exeName).getAbsolutePath
135- }
140+ val jh = jvm.getOrElse(file(sys.props.getOrElse(" java.home" , sys.error(" no java.home" ))))
141+ val exe = (jh / " bin" / exeName).getAbsolutePath
136142
137143 log.info(" Running: " + (exe +: args).mkString(" " ))
138144
139145 Process (exe, args)
140146 }
141147
142148 private object JlinkOptions {
149+ @ deprecated(" 1.3.24" , " " )
143150 def apply (addModules : Seq [String ] = Nil , output : Option [File ] = None ): Seq [String ] =
151+ apply(addModules = addModules, output = output, modulePath = Nil )
152+
153+ def apply (addModules : Seq [String ], output : Option [File ], modulePath : Seq [File ]): Seq [String ] =
144154 option(" --output" , output) ++
145- list(" --add-modules" , addModules)
155+ list(" --add-modules" , addModules) ++
156+ list(" --module-path" , modulePath)
146157
147158 private def option [A ](arg : String , value : Option [A ]): Seq [String ] =
148159 value.toSeq.flatMap(a => Seq (arg, a.toString))
149160
150- private def list (arg : String , values : Seq [String ]): Seq [String ] =
161+ private def list [ A ] (arg : String , values : Seq [A ]): Seq [String ] =
151162 if (values.nonEmpty) Seq (arg, values.mkString(" ," )) else Nil
152163 }
153164
@@ -204,5 +215,22 @@ object JlinkPlugin extends AutoPlugin {
204215 val nothing : ((String , String )) => Boolean = Function .const(false )
205216 val everything : ((String , String )) => Boolean = Function .const(true )
206217 def only (dependencies : (String , String )* ): ((String , String )) => Boolean = dependencies.toSet.contains
218+
219+ /** This matches pairs by their respective ''package'' prefixes. This means that `"foo.bar"`
220+ * matches `"foo.bar"`, `"foo.bar.baz"`, but not `"foo.barqux"`. Empty
221+ * string matches anything.
222+ */
223+ def byPackagePrefix (prefixPairs : (String , String )* ): ((String , String )) => Boolean = {
224+ case (a, b) =>
225+ prefixPairs.exists {
226+ case (prefixA, prefixB) =>
227+ packagePrefixMatches(prefixA, a) && packagePrefixMatches(prefixB, b)
228+ }
229+ }
230+
231+ private def packagePrefixMatches (prefix : String , s : String ): Boolean =
232+ prefix.isEmpty ||
233+ s == prefix ||
234+ s.startsWith(prefix + " ." )
207235 }
208236}
0 commit comments