के साथ ऐप लॉन्च करने के लिए एसबीटी प्लगइन कैसे लिखना है, मैं इसे खोलने से पहले अपने प्रोजेक्ट के लिए एक एसबीटी प्लगइन बनाना चाहता हूं।एक एजेंट
प्रोजेक्ट एक अनुप्रयोग चलाने की शुरुआत में जावा एजेंट को संलग्न करता है, इसे विभिन्न प्रकार के प्रोफाइलिंग के लिए उपकरण के लिए। एजेंट बाद में प्रसंस्करण के लिए पाठ फ़ाइलों को लिखता है।
मैं
- ,
run
के लिए एक विकल्पrunWithProfiling
जो एक नया जावा प्रक्रिया की शुरूआत कहा जाता है हो सकता है कि एजेंट के साथ तर्क सूची में जोड़ा एक एसबीटी प्लगइन लिखने में सक्षम होना चाहते हैं, और गुजर सभी उपयोगकर्ता आदेश। - बाहर निकलने पर, मैं तो एक HTML रिपोर्ट
मैं मोटे तौर पर जानते नए आदेश बनाने के लिए कैसे निर्माण करने के लिए कुछ मनमाने ढंग से पोस्ट-प्रोसेसिंग कोड आह्वान करने के लिए चाहते हैं, लेकिन मैं नहीं जानता कि कैसे सबसे अच्छा एक विकल्प लागू करने के लिए run
पर ... मैं run
करता है कि सभी कोड की प्रतिलिपि बनाकर पहिया को पुन: आविष्कार नहीं करना चाहता हूं। क्या कोई तरीका है कि मैं run
का आह्वान कर सकता हूं लेकिन यह सुनिश्चित करता हूं कि मेरे पैरामीटर पारित हो जाएं (एक बार) और यह निश्चित रूप से एक नई जावा प्रक्रिया है?
इसके अलावा, परीक्षणों के लिए ऐसा करने में सक्षम होना बहुत अच्छा होगा।
अद्यतन: इस कोड को मैं वर्तमान में है कि है, लेकिन यह ऊपर के रूप में चिह्नित है, कई समस्याओं से ग्रस्त है TODO
रों
import sbt._
import Keys._
import sbt.Attributed.data
object LionPlugin extends Plugin {
val lion = TaskKey[Unit]("lion", "Run a main class with lions-share profiling.")
override val projectSettings = Seq(
fork := true,
javaOptions ++= Seq(
"-Xloggc:gc.log", "-XX:+PrintGCDetails", "-XX:+PrintGCDateStamps",
"-XX:+PrintTenuringDistribution", "-XX:+PrintHeapAtGC"
// TODO: need to get hold of the local jar file for a particular artifact
// IMPL: pass the jar as the agent
),
lion <<= (
runner,
fullClasspath in Runtime,
mainClass in Runtime,
streams in Runtime
) map runLion
)
// TODO: update to a task that can take parameters (e.g. number of repeats, profiling settings)
def runLion(runner: ScalaRun, cp: Classpath, main: Option[String], streams: TaskStreams): Unit = {
assert(runner.isInstanceOf[ForkRun], "didn't get a forked runner... SBT is b0rk3d")
println("RUNNING with " + runner.getClass)
// TODO: ask user if main is None, like 'run' does
val m = main.getOrElse("Scratch")
// TODO: get the user's arguments
val args = Nil
runner.run(m, data(cp), args, streams.log)
// IMPL: post-process and produce the report
println("FINISHED")
}
}
यह बहुत उपयोगी है, धन्यवाद! मैं उपयोगकर्ताओं को प्रति-मॉड्यूल आधार पर इसे सेट करने की अनुमति देना चाहता हूं, और उपयोगकर्ता के कांटा/javaOptions को छूने के लिए छोड़ना चाहता हूं। मुझे डर है कि मैं अभी भी यह जानने के करीब नहीं हूं कि यह कैसे करें, अपने स्रोत को पढ़ने के बाद भी। मैं मूल रूप से उदा। शेर में कांटा: = सच', लेकिन इसे अनदेखा किया जा रहा था। – fommil
हालांकि, मैं आपके दृष्टिकोण को चुरा लेगा और सीधे 'फोर्क.जावा' का उपयोग करूंगा ... इसका मतलब है कि मैं कभी भी सेटिंग को बदल नहीं सकता हूं। – fommil