我在NetBeans中启动了一个新的Maven项目,接受了所有默认设置.将所有JAR依赖项剥离出来的POM在此问题的底部被剪切粘贴.
应用程序读入各种属性文件(例如,日志记录和配置).它还可读取字体,图像和声音等外部资源.我不希望将所有这些资源捆绑到JAR文件中.相反,我计划将它们部署在部署JAR的目录下的子目录中.
项目目录结构的简化视图如下所示:
-src
|---main
|---java
|---com.mypackage, etc
|---resources
|---conf
|---fonts
|---images
|---sounds
+target
Run Code Online (Sandbox Code Playgroud)
我会喜欢一个干净的构建是这样以后有:
+src
-target
|---myproject-1.0.0.jar (compiled contents of "src/main/java" ONLY)
|---conf
|---fonts
|---images
|---sounds
Run Code Online (Sandbox Code Playgroud)
但是,当我通过NetBeans(或命令行)执行"清理并构建"或"执行"时......我实际得到的内容如下所示:
+src
-target
|---classes
|---("src/main/java" and "src/main/resources" slammed together)
|---myproject-1.0.0.jar (the "classes" subdirectory JAR'ed up)
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向获得第一个结果而不是第二个结果吗?如果这是一个愚蠢的问题(我是Maven新手),或者如果我忽略了以前要求的副本,我道歉.但是,从我在Stack Overflow上的搜索开始......看起来所有重复的问题都试图走向另一个方向!(即获取资源到一个JAR,而不是让他们出去)
pom.xml中:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>steveperkins</groupId>
<artifactId>myproject</artifactId>
<packaging>jar</packaging>
<version>1.0.0</version>
<name>My Project</name>
<url>http://maven.apache.org</url>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.4</source>
<target>1.4</target>
</configuration>
</plugin>
</plugins> …
Run Code Online (Sandbox Code Playgroud) 我正在使用Eclipse(Helios)和"m2eclipse"插件.我正在开发一个基于Maven的Web应用程序项目,我在Eclipse内部设置的本地Tomcat服务器上进行测试.
一般来说,这或多或少都有效."m2eclipse"有时可能是片状的...但是在大多数情况下它会使我的POM和我的Eclipse项目设置保持同步,同样在Tomcat中保持已部署的代码最新.
然而,最近我添加了一个皱纹.我有一个JavaScript包含文件,从测试环境到实际生产环境时需要有所不同.这些差异太大,无法通过Maven过滤和令牌替换进行干净处理.我需要的是在我的项目中保留两个单独的文件,并且只部署适合构建配置文件的文件.
我在Maven POM中用一些"targetPath"技巧完成了这个:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webResources>
<resource>
<!-- take the stuff from a "prod" or "non-prod" subdirectory and copy it one level up -->
<directory>src/main/webapp/js/${profile.name}</directory>
<targetPath>js</targetPath>
</resource>
<resource>
<!-- now don't deploy those profile-specific subdirectories -->
<directory>src/main/webapp/js</directory>
<excludes>
<exclude>prod</exclude>
<exclude>non-prod</exclude>
</excludes>
</resource>
</webResources>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这构建了一个完美的WAR文件,当我部署一些外部Tomcat服务器时,它可以正常工作.但是,问题是Eclipse在Eclipse中运行Tomcat时不使用该WAR文件.相反,Eclipse使用应用程序的爆炸版本,部署到一个神秘的目录,如下所示:
<workspace>/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/MyApp
Run Code Online (Sandbox Code Playgroud)
......显然应用程序的文件被复制到此位置,在Maven执行上面显示的小技巧之前.因此,在Eclipse内部进行本地测试时,预期位置中根本不存在JavaScript包含.
有没有解决这个问题的方法?可能是Eclipse更改或Maven更改,将文件从Maven的"目标"目录拉到Eclipse的"wtpwebapps"目录中?也许有另一种解决特定于配置文件的包含文件问题的方法?
我试图使用Grails Scaffolding在一些遗留数据库表周围抛出一个快速的CRUD应用程序(到目前为止,请参阅此前的StackOverflow问题).我现在已经过了最糟糕的问题,并且有一个正常运行的CRUD应用程序,但是一般可用性仍存在一个问题.
我的许多域对象都与其他域对象具有外键关联.A Contact
属于Owner
等等
但是,在CRUD页面上Contact
,我不想看到...的实际id
键,Owner
因为这对人类用户没有任何意义.我想要在Owner.name
屏幕上显示更人性化的值.
"list"和"show"Views明确处理View自动生成的代码中的所有属性,并且我能够调整该代码来控制所呈现的内容.但是,"创建"和"编辑"视图不会列出所有属性.相反,这些视图会像这样生成某种Grails taglib调用:
...
<fieldset class="form">
<g:render template="form"/>
</fieldset>
...
Run Code Online (Sandbox Code Playgroud)
此调用显然在运行时自动检测字段是什么,并自行决定如何显示它们.对于具有关联的域对象,它使得显示关联对象的乱码ID的错误决定而不是更人性化的属性.
是否有一种"简单"(或至少是"最佳实践")方式来更改字段在"编辑"或"创建"视图中的显示方式?当使用Scaffolding与具有关联的域对象一起使用时,这是一个常见问题.
我一直在修改 Spring Cloud Config,但有一个用例,其中配置属性分为两种类型:
非秘密值,开发人员应该能够查看和维护(例如 JDBC URL 等)
秘密值,只能由具有特殊访问权限(例如密码)的指定人员查看和维护
所以我对“复合环境存储库”的支持非常感兴趣,目前在快照版本中可用。似乎我可以将 Git 用于开发人员管理的属性,将 Vault 用于机密属性,并对其进行配置,以便在发生冲突时 Vault 始终优先于 Git。
但是,我发现 Vault 不仅总是优先……它被用作唯一的后端。根本不返回来自 Git 的任何属性。
我的application.yml
看起来像这样:
spring:
profiles:
active: git, vault
cloud:
config:
server:
vault:
order: 1
git:
uri: https://github.com/spring-cloud-samples/config-repo
basedir: target/config
order: 2
Run Code Online (Sandbox Code Playgroud)
我已经像这样向 Vault 写了一个属性:
vault write secret/foo foo=vault
Run Code Online (Sandbox Code Playgroud)
我像这样调用我的配置服务器:
curl -X "GET" "http://127.0.0.1:8888/foo/default" -H "X-Config-Token: a9384085-f048-7c99-ebd7-e607840bc24e"
Run Code Online (Sandbox Code Playgroud)
但是,JSON 响应负载仅包含 Vault 属性。没有来自 Git:
{
"name": "foo",
"profiles": [
"default"
],
"label": null,
"version": null,
"state": null, …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个基于Netty的小型应用程序,该应用程序通过套接字连接(即telnet / ssh)执行I / O操作。我正在用Netty的ServerBootstrap
类启动我的套接字服务器,给它:
类型的事件循环NioEventLoopGroup
(即不应接受阻塞操作的共享线程池)。
一个类型的通道NioServerSocketChannel
(我相信这必须与上面的#1相对应)。
一个非常简单的管道,带有可扩展的通道处理程序ChannelInboundHandlerAdapter
。
channelRead(...)
每当从客户端套接字连接接收到命令字符串时,都会调用我的处理程序的方法,并根据命令返回一些响应字符串。
对于不涉及阻塞操作的命令,一切都很好。但是,有些命令现在需要从数据库读取或写入。这些JDBC调用本质上将受到阻塞……尽管我可以使用CompletableFuture
(或其他方法)在单独的线程中处理它们。
但是,即使我通过在单独的线程中执行阻止操作来实现“自己拥有自己的异步”,我也不知道如何将那些产生的线程的结果重新连接回主线程中的Netty通道处理程序。
我看到ChannelHandlerContext
该类具有以下方法:
ChannelFuture writeAndFlush(Object msg, ChannelPromise promise);
...作为我目前正在使用的替代方案:
ChannelFuture writeAndFlush(Object msg);
但是我找不到任何文档或指南(甚至是有用的Javadocs)来解释ChannelPromise
在这种用例中如何使用这种类型。顾名思义,它可能相关,但可能无关。毕竟,该writeAndFlush
方法仍然将传出消息作为它的第一个参数...因此,如果您需要将其结果保存在第一个参数中,那么将阻塞操作填充到“承诺”第二个参数中有什么好处参数?
这里正确的路是什么?有什么方法可以处理单独线程中的阻塞操作,以使Netty NioEventLoopGroup
不会阻塞?还是这不是Netty的工作原理,如果需要支持阻塞,应该使用不同的事件循环实现(即为每个客户端套接字连接生成一个单独的线程)。
我正在尝试包中的示例代码kivy_examples
。在配备 Retina 显示屏的 Macbook Pro 上,它还连接到具有标准像素密度的外部显示器。
当我启动任何示例应用程序时,窗口首先出现在内置 Retina 显示屏上,并且看起来不错。然后,当我将该窗口拖动到外部显示器时,突然所有小部件的大小都放大了。
StackOverflow 上存在许多涉及 Kivy 和像素密度的问题。但问题和答案似乎都涉及单屏用例。您不知道目标屏幕的密度可能是多少,因此以下是如何使用该dp(...)
功能在应用程序启动时配置该屏幕等。
但是,我找不到任何涉及多显示器用例的讨论。当应用程序在多个显示器之间移动时,有什么方法可以让 Kivy 应用程序动态响应像素密度变化?与在启动时配置固定密度级别相反?
考虑一下我正在使用的一些代码的简化视图:
@Stateless(...)
@Remote(...)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class FirstEjbType {
@EJB(...)
private SecondEjbType secondEjb;
@EJB(...)
private ThirdEjbType thirdEjb;
public void doSomething() {
secondEjb.doSomething(); // WRITES SOMETHING TO THE DATABASE
thirdEjb.doSomething(); // CAN'T SEE THAT SOMETHING IN THE DATABASE!
}
Run Code Online (Sandbox Code Playgroud)
我已将TransactionAttribute
注释设置为MANDATORY
类级别.我理解这意味着doSomething()
必须在提供的事务中调用所有方法.在这种情况下,我们使用容器管理的事务.
将TransactionAttribute
未使用的全部SecondEjbType
或ThirdEjbType
...既没有类,也没有方法的水平.我明白这意味着secondEjb.doSomething()
并thirdEjb.doSomething()
会为双方提供的事务中进行操作firstEjb.doSomething()
.
但是,我真的错过了什么!如代码注释所示... secondEjb
将数据写入数据库,并将thirdEjb
该数据作为其操作的一部分进行读取.由于所有这些都在同一个事务中运行,我不希望隔离级别存在任何问题. 但是,无论出于何种原因,secondEjb
数据库写入都不可见thirdEjb
.
我已经将跟踪一直转到最大值,并且显然没有异常或错误或回滚问题......初始写入对后续读取不可见.我并不认为自己是交易管理方面世界上最伟大的大师...我是否错过了一些明显的东西,或者我的概念理解基本正确,问题可能在其他地方?
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
…
我正在与一家小公司合作,这种公司正在经历从初创企业文化向更成熟的企业文化过渡的日益增长的痛苦.在过去,开发人员可以或多或少地自由地访问UAT环境,甚至可以在很大程度上访问生产环境.
但是,根据新方法,开发人员只能访问Dev和初始QA环境......并且无法访问UAT和生产环境.对这些环境的所有访问,从部署代码(在本例中为Java WAR)到管理Java应用服务器,甚至查看日志和数据库,都必须通过系统管理员进行管道传输.
它还处于早期阶段,但到目前为止,这种方法似乎并不成立.最终结果是每次出现生产问题,或者甚至只是在UAT中输入错误票时 ......它需要一个"全手"会议,一半的部门挤进某人的办公室或挤在一个人的监视器周围.
我想提出一些更可行的方法,同时仍然满足限制访问敏感用户数据等的需要.想到的一个想法是为日志文件目录创建一个只读安装,在开发人员可能的其他位置至少查看应用程序级日志.但是,除此之外,我对如何限制开发人员访问的最佳实践感兴趣,同时尽可能降低生产力.
注意:在我写这篇文章之前,我确实找到了一些模糊的类似问题.然而,它们要么太狭窄(和这里),要么处理萨班斯 - 奥克斯利法案中没有问题的问题,或者只是问"这些限制是否正常?" 而不是问如何应对它们.
在高级别,我有一个Java应用程序,其中某些事件应该触发当前用户采取的某个操作.但是,事件可能非常频繁,并且操作始终相同.因此,当第一个事件发生时,我想在不久的将来安排行动(例如5分钟).在该时间窗口期间,后续事件不应采取任何操作,因为应用程序发现已经安排了一个操作.一旦计划的操作执行,我们将返回步骤1,下一个事件将再次开始循环.
我的想法是通过在应用程序本身内嵌入内存中的ActiveMQ实例来实现这种过滤和限制机制(我不关心队列持久性).
我相信JMS 2.0支持延迟传送的概念,延迟消息位于"暂存队列"中,直到传送到真实目的地为止.但是,我也相信ActiveMQ还不支持JMS 2.0规范......所以我正在考虑模仿生存时间(TTL)值和死信队列(DLQ)处理的相同行为.
基本上,我的消息生成器代码会将消息放在虚拟登台队列上,消费者从中没有任何东西.消息将以5分钟的TTL值放置,并在到期时ActiveMQ将它们转储到DLQ中. 这是我的消息消费者实际消费消息的队列.
我认为我不想实际使用"默认"DLQ,因为我不知道ActiveMQ可能在那里转储哪些与我的应用程序代码完全无关的内部事物.所以我认为我的虚拟登台队列最好有自己的自定义DLQ.我只看过一页讨论DLQ配置的ActiveMQ文档,它只针对独立的ActiveMQ安装(不是嵌入在应用程序中的内存代理)的XML配置文件.
是否可以在运行时以编程方式为嵌入式ActiveMQ实例中的队列配置自定义DLQ?
如果你认为我走错了路,我也有兴趣听听其他建议.我对JMS比AMQP更熟悉,所以我不知道Qpid或其他一些Java嵌入式AMQP代理是否更容易.无论Apache Camel究竟是什么(!),我相信它应该在这类事情上表现出色,但这种学习曲线对于这个用例来说可能是彻底的过度杀伤力.
我的工作,它使用JPA持久性的一个项目,我试图找到用于测试JPQL查询最清洁和最有效的手段.我更习惯了Hibernate的世界......在你可以在应用程序之外的临时性的测试HQL,使用Hibernate工具和Hibernate的控制台.我相信,工具也支持JPQL如果您使用Hibernate作为JPA提供者,但不幸的是在这种情况下,我在GlassFish和使用的TopLink.
是否有任何粗糙的等价物的Hibernate控制台L out输出有(或开发中)在一般JPA世界?如果没有,你有什么发展过程中与JPQL查询各地修修补补典型的做法?