我pom.xml的很乱,随着时间的推移收集了cruft。有没有自动的方法来“清理”一个pom?就像一个短绒,但对于 maven。
在 IntelliJ 中,我可以运行Analyze > Inspect Code并获取未使用的函数、愚蠢的迭代器和可能的错误的列表。我想我正在为我的 pom 寻找同样的东西
mvn versions:display-dependency-updates有效,但不限于非破坏性版本更新)阅读完以下内容后,我仍然坚持制作最低限度的https ://localhost 独立免安装 Web 服务器 Java 应用程序。它需要是无库的,使用 Java 8,并接受来自浏览器的连接,而无需先安装任何特殊的客户端证书。我不清楚自签名证书是否可以实现这一点,因为它只适用于“localhost”。
到目前为止,我已经使用生成了一些关键文件
openssl genrsa -aes128 -out privkey.pem 2048 # makes privkey.pem
openssl req -new -x509 -key privkey.pem # makes cert.crt
Run Code Online (Sandbox Code Playgroud)
我已经拼凑了最基本的 Kotlin 设置函数
private fun ssl():SSLServerSocketFactory {
val password = "MYPASSWORD".toCharArray()
val kmf = KeyManagerFactory.getInstance("SunX509")
val tmf = TrustManagerFactory.getInstance("SunX509")
val sslContext = SSLContext.getInstance("TLS")
// initialise the keystore
KeyStore.getInstance("JKS").let { ks->
FileInputStream("lig.keystore").use {
ks.load(it, password)
}
kmf.init(ks, password)
tmf.init(ks)
}
// …Run Code Online (Sandbox Code Playgroud) 我有很多我的应用程序正常使用"懒惰"初始化程序,因为一切都神奇地按照必要的顺序发生.
但并非所有初始化程序都是同步的.其中一些是包装回调,这意味着我需要等到回调发生,这意味着我需要runBlocking和suspendCoroutine.
但在重构一切后,我明白了 IllegalStateException: runBlocking is not allowed in Android main looper thread
什么?你不能阻止?你在这里杀了我.如果我的"偷懒"恰好是阻挡功能,那么正确的方法是什么?
private val cameraCaptureSession: CameraCaptureSession by lazy {
runBlocking(Background) {
suspendCoroutine { cont: Continuation<CameraCaptureSession> ->
cameraDevice.createCaptureSession(Arrays.asList(readySurface, imageReader.surface), object : CameraCaptureSession.StateCallback() {
override fun onConfigured(session: CameraCaptureSession) {
cont.resume(session).also {
Log.i(TAG, "Created cameraCaptureSession through createCaptureSession.onConfigured")
}
}
override fun onConfigureFailed(session: CameraCaptureSession) {
cont.resumeWithException(Exception("createCaptureSession.onConfigureFailed")).also {
Log.e(TAG, "onConfigureFailed: Could not configure capture session.")
}
}
}, backgroundHandler)
}
}
}
Run Code Online (Sandbox Code Playgroud)
该类的完整GIST,用于了解我最初想要实现的目标:https://gist.github.com/salamanders/aae560d9f72289d5e4b49011fd2ce62b
我试图让一个普通的可怜人的数据持久化功能,将采取一个MutableSet的数据类,并将其序列化到磁盘.我想要一些简单的原型设计,并且可以经常在集合上调用"save()",这样如果我的进程被杀死,我可以稍后使用已保存条目的"load()"恢复.
但即使重读了Generics页面,我也没有完全区分'*','in','out'和'Nothing'之间的区别.这个SEEMS可以在不抛出错误的情况下工作,但我不明白为什么他们都"出局",我认为一个人必须"进入"...或者更可能我理解Kotlin Generics完全错误.这样做有正确的方法吗?
/** Save/load any MutableSet<Serializable> */
fun MutableSet<out Serializable>.save(fileName:String="persist_${javaClass.simpleName}.ser") {
val tmpFile = File.createTempFile(fileName, ".tmp")
ObjectOutputStream(GZIPOutputStream(FileOutputStream(tmpFile))).use {
println("Persisting collection with ${this.size} entries.")
it.writeObject(this)
}
Files.move(Paths.get(tmpFile), Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING)
}
fun MutableSet<out Serializable>.load(fileName:String="persist_${javaClass.simpleName}.ser") {
if (File(fileName).canRead()) {
ObjectInputStream(GZIPInputStream(FileInputStream(fileName))).use {
val loaded = it.readObject() as Collection<Nothing>
println("Loading collection with ${loaded.size} entries.")
this.addAll(loaded)
}
}
}
data class MyWhatever(val sourceFile: String, val frame: Int) : Serializable
Run Code Online (Sandbox Code Playgroud)
然后能够启动任何应用程序
val mySet = mutableSetOf<MyWhatever>()
mySet.load()
Run Code Online (Sandbox Code Playgroud) 我正在编译 Kotlin(JRE) 并将其部署到一个小机器人上。我非常幸运地创建了一个带有依赖项的 jar,谢谢 StackOverflow。
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>${project.main.class}</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
但罐子很大,大约有 25mb 大。没有依赖项的 jar 大小是完全合理的 26kb,这确实很重要,因为打包那个大 JAR 很慢,然后我scp每次都必须将其部署到机器人。
我能够将所有依赖项预加载到机器人上的一个文件夹中,通过mvn dependency:copy-dependencies并将它们复制过来。(再次感谢 StackOverflow)。现在我需要一种简单的方法来设置一个属性,使其只需编译和复制即可target/MYBOT-1.0-SNAPSHOT.jar,而不必target/MYBOT-1.0-SNAPSHOT-jar-with-dependencies.jar每次都尝试编译文件。
如果我不在乎,我会在lineSequence上做一个“ first”,如果存在,请重新运行正则表达式。
val possibleMatch = input.lineSequence().first { myRegex.matches(it) }
Run Code Online (Sandbox Code Playgroud)
...但是我想成为科特林酷派,而不必重新运行正则表达式。我应该使用映射到MatchGroup并过滤出null吗?感觉比以前更冗长...
input.lineSequence()
.mapNotNull { myRegex.find(it) }
.map { it.groupValues[1] }
.first()
Run Code Online (Sandbox Code Playgroud) Java 具有 ThreadLocal 变量,这些变量非常适合运行并行操作,而无需踩踏其他线程或每个循环分配,例如 OpenCV 使用videoCapture.retrieve(image),“图像”可能是线程局部变量。
Kotlin 对“协程本地”变量有任何意义吗?如果我想以他们的反例为例,但每个协程都有一个计数器,我该怎么做?
for (i in 1..1_000_000)
thread(start = true) {
c.addAndGet(i)
}
Run Code Online (Sandbox Code Playgroud)