我有一个Java服务器应用程序,它使用Jackson通过反射API一般地序列化DTO.例如,对于此DTO界面:
package com.acme.library;
public interface Book {
com.acme.library.Author getAuthor();
String getTitle();
}
Run Code Online (Sandbox Code Playgroud)
从这个界面的POJO实现,Jackson将一般序列化以下实体:
{
"author": { "name": "F. Scott Fitzgerald"},
"title": "The Great Gatsby"
}
Run Code Online (Sandbox Code Playgroud)
将使用我的TypeScript应用程序(基于AngularJS)的HTTP GET接收此有效负载:
$http.get("http://localhost/books/0743273567")
.success((book: Book) => { ... });
Run Code Online (Sandbox Code Playgroud)
因此我能够使用TypeScript的强类型性质,我发现自己手工编写以下的typescript接口:
module com.acme.library {
export interface Book {
author: com.acme.library.Author;
title: String;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我必须保留这个相同界面的两个副本 - 这最多是麻烦的.这变得特别讨厌,因为我想在两个接口上都有相同的javadoc/jsdoc注释,这涉及整个复制和粘贴堆.
我想找到一种自动化这个过程的机制.
Java是我的主要开发语言.因此,我想找到一些能够从Java接口声明(通过反射API?)转换到相关TypeScript接口的工具.
我在这个领域发现的唯一工具是NPM包ts-java
.但是,这对我的用例来说太重了.它增加了从对象层次结构的方法给每个接口,例如hashCode()
,wait()
,getClass()
等.
因此,我们可以执行从前到后的Web UI测试,我们使用Selenium和ChromeDriver自动化页面加载/交互作为我们测试包的一部分.
这在开发人员测试期间(在开发人员的本地计算机上)表现得如预期,但我们正在努力执行这些检查,作为我们持续集成构建的一部分.
我们的服务器工厂基于*NIX,我们所有的CI基础设施都在这些机器上运行.因此我们可以在Windows(我们的交付机制)下测试Chrome,我们已经配置了Selenium Grid.当CI测试运行时,他们访问网格,以便找到运行测试的Windows节点.
我们已经配置了Windows桌面,仅用于运行这些测试.这包含我们标准的Windows 7企业版本.该机器将定期重新启动,与IT部门的更新策略一致.
为了确保Selenium服务器始终运行,我们将Selenium Server(以"节点"模式运行)添加为Windows服务.selenium Server配置为启动ChromeDriver以调用模拟的用户交互.
但是,从CI运行测试时,由于超时而失败.我们的工作原理是,运行服务的系统用户无法创建交互式窗口.网络搜索引发了对"会话0"问题的引用,但对如何向前推进几乎没有建设性意见.
从交互式会话手动启动Selenium Server进程不是一个可行的解决方案,因为这会导致脆弱的测试 - 由于基础结构问题导致测试失败,而不是真正的测试回归.
每当系统重新启动时,我们如何通过Windows服务启动Selenium Server实例,该实例能够启动Chrome实例?
我正在使用基于NPM的工具(grunt
)构建HTML5前端.
我的持续集成构建过程的第一步是运行一个npm install
.
npm install
很慢.即使使用本地NPM代理缓存工件(Sonatype的Nexus 3),它仍然需要4分钟!
$> time npm install
real 4m17.427s
user 0m0.170s
sys 0m0.290s
Run Code Online (Sandbox Code Playgroud)
如果我按照通常的最佳实践进行持续集成,我将从一个原始的SCM存储库开始并运行构建.这意味着每次CI构建都必须重新开始npm install
并承担4分钟的费用.
这是一个显著的我的编译时间比例.我不满意构建需要这么长时间.
替代方案似乎是node_modules
在构建之间保持一致.但是,我遇到了构建变得不稳定的问题.
删除依赖项package.json
并不会node_modules
简单地删除它们npm install
.我可以用npm prune
第一个来解决这个问题.
什么被认为是最佳做法?
所以,我一直想要使用Lombok一段时间 - 我终于开始了一个我可以使用它的项目.需要注意的重要一点是,这将是一个大型的企业级应用程序,因此使用的集成模式必须是有意义的,尽可能少的黑客攻击.
所以我看了一下lombok-maven-plugin和整个delombok
软糖.我知道这将复制我的所有代码,并扩展现有的lombok注释.这给了我第二组生成的.java
文件,这些文件需要在编译期间由maven使用.
但是,通过生成这些新的源文件 - eclipse会选择它们并尝试将它们引入我的项目中.因此,它会触发关于重复类的一百万(OK,轻微夸大)错误.
一些解决方案建议我改变<sourceDirectory>
我的POM.这会让事情变得更好,因为mvn eclipse:eclipse
现在src/main/java
将从项目中完全省略我的java目录 - 只显示delombok进程的输出.
然后提出我需要使用一个配置文件来编译/打包项目,以及另一个配置文件mvn eclipse:eclipse
.这不是一个可接受的解决方案,因为我不得不花费足够的时间来维护/解释我已经很复杂的maven设置 - 而不必引入一个全新的配置文件(除了我现有的配置文件).
我希望有一些灵感可以让我免于为我的项目写下Lombok.这是一个减少样板代码的好工具,但它似乎还没有为黄金时段的企业使用做好准备 - 我觉得非常令人失望:-(
以下是我目前的POM:
<build>
<sourceDirectory>target/generated-sources/delombok</sourceDirectory>
<testSourceDirectory>target/generated-test-sources/delombok</testSourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.12.2.0</version>
<dependencies>
<dependency>
<groupId>sun.jdk</groupId>
<artifactId>tools</artifactId>
<version>1.7</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
<executions>
<execution>
<id>delombok</id>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<addOutputDirectory>false</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</execution>
<execution>
<id>test-delombok</id>
<phase>generate-test-sources</phase>
<goals>
<goal>testDelombok</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<addOutputDirectory>false</addOutputDirectory>
<sourceDirectory>src/test/java</sourceDirectory>
</configuration> …
Run Code Online (Sandbox Code Playgroud) 我的团队成员将处理许多纯文本文件.我不想使用普通的文本编辑器,而是希望他们使用eclipse,因此我们可以利用插件来简化生活......例如svn插件.
因此,我想为他们提供Eclipse的安装,他们将在那里设置通用项目,而不是Java项目.
但是,从网站上下载的基本Eclipse包括所有java功能.这意味着他们的GUI充斥着不需要的与java相关的功能,我真的不希望他们使用它们.
我试图从安装中删除JDT插件/功能,但此时通用项目功能也消失了!
如何在保留通用项目功能的同时去除java功能?
我的角应用包含有一个锚标记routerLink
和click
与之相关的处理程序:
<a [routerLink]="/abc" (click)="onClick"> </a>
Run Code Online (Sandbox Code Playgroud)
我想routerLink
在用户右键单击并选择"在新标签页中打开"时使用.
该click
如果用户只需左键点击的链接处理程序应被触发.在这种情况下,我不希望routerLink
触发路由更改.
在我的点击处理程序中,我尝试中止点击事件,即
public onClick(event: MouseEvent): {
// Was hoping this would do it...
event.preventDefault();
// .. clutching at straws
event.stopPropagation();
// .. oh dear oh dear. Still not working
event.stopImmediatePropagation();
}
Run Code Online (Sandbox Code Playgroud)
这些都不会妨碍routerLink
激活和导航新路线/abc
.如何让我的click
处理程序阻止routerLink
被解雇?
在我的组织内部,我受到IT安全机构的严格监管.因此,禁止所有访问maven镜像.但是,我可以提供我需要的依赖项的详细信息,以便IT安全人员可以执行其检查/扫描,并希望为我下载二进制文件.
然后我在我的本地maven repo中安装这些,这意味着它们可以在防火墙内免费提供给我的团队.
maven的美妙之处在于它可以识别和下载传递依赖.但是,如果无法访问外部POM文件,我无法通过maven dependency:tree执行这些检查.
因此,我必须一次一个地向IT部门提供依赖项.鉴于某些依赖链的深度,这可能需要相当长的时间才能回归/转发IT.或者,我在家里做依赖:树,并自己邮寄结果.
我想知道是否有人对我可以查询此信息的网站有任何建议?所以,如果我想(比如)log4j:1.2.17,它会告诉我我还需要请求javax.mail:mail:1.4.3.
我正在寻找有关第三方库的建议,用于对BigDecimal/BigInteger中编码的数字进行统计分析.
Apache commons-math包含所有理想的功能(它是DescriptiveStatistics和SummaryStatistics)......但它使用的是双打而不是BigXXX实现.
由于对我的软件精度的监管要求,我需要使用BigXXX实现.但是我非常希望不要自己实现我需要的基本统计数据.
例如,编写我自己的中值算法很容易 - 但是拾取高精度数据类型似乎违反直觉,然后使用我自己的不成熟(因此,可能是错误的)方法来执行它们的统计.
我想以二进制格式存储一个非常简单的 pojo 对象:
public class SampleDataClass {
private long field1;
private long field2;
private long field3;
}
Run Code Online (Sandbox Code Playgroud)
为此,我编写了一个简单的序列化/反序列化方法对:
public class SampleDataClass {
// ... Fields as above
public static void deserialize(ByteBuffer buffer, SampleDataClass into) {
into.field1 = buffer.getLong();
into.field2 = buffer.getLong();
into.field3 = buffer.getLong();
}
public static void serialize(ByteBuffer buffer, SampleDataClass from) {
buffer.putLong(from.field1);
buffer.putLong(from.field2);
buffer.putLong(from.field3);
}
}
Run Code Online (Sandbox Code Playgroud)
简单高效,最重要的是二进制格式的对象大小是固定的。我知道序列化的每条记录的大小将是 3 x 长,即 3 x 8 字节 = 24 字节。
这是至关重要的,因为我将按顺序记录这些,稍后我需要能够通过索引找到它们,即“找到我第 127 条记录”。
This is working fine for me, but I …
我使用以下JVM参数来启动主机调试程序的JVM.
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0
Run Code Online (Sandbox Code Playgroud)
请注意,我正在分配端口零,以便JVM向操作系统请求临时端口.这对我的用例至关重要,以确保JVM不会因为某些预定义端口的争用而无法启动.
结果我的JVM启动,并将以下日志条目输出到stdout
:
Listening for transport dt_socket at address: XXXX
Run Code Online (Sandbox Code Playgroud)
我想找到一些方法来识别JVM内部或外部的调试端口,因此我可以将它记录在状态管理服务器中.
这个用例有哪些选择?我已经考虑了以下几点,但没什么乐趣:
java ×5
eclipse ×2
maven ×2
angular ×1
bigdecimal ×1
biginteger ×1
jvm ×1
jvm-hotspot ×1
lombok ×1
npm ×1
selenium ×1
statistics ×1
typescript ×1
webdriver ×1